SELECT ANY TABLE 权限在 Oracle 中如何工作?

Los*_*ity 6 sql oracle privileges

我想知道SELECT ANY TABLEOracle内部的权限是如何工作的。

它是否被视为单一特权?或者相当于GRANT SELECT ON MyTable TO MyUser为每个表创建一个?

例如,我想知道这是否有效:

GRANT SELECT ANY TABLE TO PUBLIC;
REVOKE ALL ON MY_TABLE FROM PUBLIC;
Run Code Online (Sandbox Code Playgroud)

MY_TABLE在这些查询之后我仍然可以从任何用户那里访问吗?

Ale*_*ole 8

是的,所有用户仍然可以查询MY_TABLE

\n\n

您正在查看不同的特权类型

\n\n
\n

用户权限的主要类型如下:

\n\n
    \n
  • 系统权限\xe2\x80\x94A 系统权限使用户能够执行特定操作,或对特定类型的任何架构对象执行操作。例如,系统权限CREATE TABLE允许用户在与该用户关联的模式中创建表,并且系统权限CREATE USER允许用户创建数据库用户。
  • \n
  • 对象权限\xe2\x80\x94 对象权限使用户能够对特定模式对象执行特定操作。不同类型的模式对象可使用不同的对象权限。EMPLOYEES从表中选择行或从表中删除行的权限DEPARTMENTS是对象权限的示例。
  • \n
\n
\n\n

SELECT ANY TABLE是一种系统特权,允许被授予者:

\n\n
\n

查询任何模式中的表、视图或物化视图,除了SYS. 使用 获取行锁SELECT ... FOR UPDATE

\n
\n\n

当您授予它是独立的单一权限时,在 中可见dba_sys_privsdba_tab_privs当 Oracle 决定是否允许用户访问表时,它可以首先查看系统权限,并且仅在不存在允许执行操作的系统权限时才继续查找特定的对象权限(在 中可见)。

\n\n

系统权限不会转换为数据库中每个对象的单独权限 - 维护这将是可怕的,因为创建一个新对象必须根据系统权限自动确定谁应该被授予该对象的权限;这意味着您无法区分它与单独授予的权限之间的区别。因此,例如,如果您在特定表上显式授予 select privs,则用户被授予SELECT ANY TABLE,然后他们被SELECT ANY TABLE撤销 - 之前的显式授予会发生什么?

\n\n

您的场景基本相同,只是您指定了要撤销的对象的所有权限。如果这是唯一涉及的两个命令,则PUBLIC没有显式特权MY_TABLE,因此撤销实际上不会执行任何操作;但如果该表上的任何显式特权已被授予,那么它们将被撤销。但这对更高级别的SELECT ANY TABLE系统权限没有影响。

\n\n

特权可累积;撤销对特定对象的权限不会阻止对该对象的访问,它只是删除一种可能的访问路径。

\n\n

顺便说一句,希望您使用了一个人为的示例,因为应谨慎授予如此强大的系统权限,并且仅在真正需要时才授予。让任何用户查询数据库中的任何表都可能会在安全模型中造成一个大漏洞。再次来自文档

\n\n
\n

Oracle 建议您仅将ANY权限授予受信任的用户

\n
\n\n

\n\n
\n

Oracle 建议不要向 授予系统权限PUBLIC

\n
\n\n

并阅读数据库安全指南中的更多内容。

\n