我假设它可以完成,我只是不知道如何或无法找到一种方法来做到这一点。
在 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 或 SQL Developer 这样的 PL/SQL IDE,还是其他任何东西,这些应用程序都需要查询数据字典。
但是,他们将在任一视图中看到的数据将仅限于他们有权访问的对象(对于ALL_*
视图)或他们拥有的对象(对于USER_*
视图)。限制用户查询数据字典以确定用户拥有哪些对象或用户有权访问哪些对象的能力将达到什么目的?如果希望用户拥有一张桌子,但又不允许用户知道他拥有这张桌子,这似乎是非常奇怪的。
现在,如果您真的下定了决心,您可以在用户的模式(表或视图)中创建对象,例如,ALL_TABLES
或USER_TABLES
. 假设用户只是查询ALL_TABLES
而不是指定完全限定的SYS.ALL_TABLES
,他们将查询本地对象而不是数据字典视图。这通常是一件非常不可取的事情——许多产品通过查询数据字典来工作,因此导致数据字典查询返回错误的数据集可能会导致各种难以追踪的错误。但如果您真的非常想限制从数据字典返回的数据,这是一个选择。