私はそれができると思います、私はそれをする方法を知らないか、または見つけることができませんでした。
Oracleでは、ALL_ *テーブルへのアクセスが可能であり、選択許可を含め、USER_*テーブルを取り消すことができます。
たとえば、all_objects、all_proceduresビュー。これらへのアクセスを制限できますか?
user_tablesとuser_procedures、およびその他のuser_*ビューについても同じことが言えます。それらへのアクセスを制限できますか?
私はそれができると思います、私はそれをする方法を知らないか、または見つけることができませんでした。
Oracleでは、ALL_ *テーブルへのアクセスが可能であり、選択許可を含め、USER_*テーブルを取り消すことができます。
たとえば、all_objects、all_proceduresビュー。これらへのアクセスを制限できますか?
user_tablesとuser_procedures、およびその他のuser_*ビューについても同じことが言えます。それらへのアクセスを制限できますか?
ALL_*
いいえ、ユーザーがまたはUSER_*
ビューをクエリできるようにすることを(合理的に)防ぐことはできません。これらのビューのすべてにアクセスして個別に取り消すことができますPUBLIC
が、それを実行するのはかなり骨の折れる作業であり、Oracleからのスクリプトの破損は言うまでもなく、あらゆる種類のアプリケーションが破損する原因になります。すべてのデータベースAPIがデータディクショナリビューに問い合わせるため、少なくとも、データベースに接続している任意のアカウントにこれらのビューへのアクセスを再許可することになります。ODBCアプリケーション、JDBCアプリケーション、TOADやSQLDeveloperなどのPL/ SQL IDE、またはその他のアプリケーションのいずれを使用する場合でも、これらのアプリケーションはデータディクショナリをクエリする必要があります。
ただし、どちらのビューにも表示されるデータは、アクセスできるオブジェクト(ALL_*
ビューの場合)または所有しているオブジェクト(ビューの場合)に制限されUSER_*
ます。ユーザーがデータディクショナリにクエリを実行して、ユーザーが所有しているオブジェクトやユーザーがアクセスできるオブジェクトを判別する機能を制限することで、どのような目的が果たされますか?ユーザーにテーブルを所有してもらいたいが、ユーザーにそのテーブルを所有していることを知らせないようにするのは非常に奇妙に思えます。
これで、本当に決心した場合は、ユーザーのスキーマ(テーブルまたはビュー)に、say、ALL_TABLES
またはという名前のオブジェクトを作成できますUSER_TABLES
。ALL_TABLES
ユーザーが完全修飾を指定するのではなく、単にクエリを実行すると仮定すると、ユーザーSYS.ALL_TABLES
はデータディクショナリビューではなくローカルオブジェクトをクエリします。これは一般的に非常に賢明なことではありません。多くの製品はデータディクショナリをクエリすることで機能するため、データディクショナリクエリが間違ったデータセットを返すと、追跡が非常に難しいあらゆる種類のバグが発生する可能性があります。ただし、データディクショナリから返されるデータを本当に制限したい場合はオプションです。