我想知道特权SELECT ANY TABLE
在Oracle内部如何工作。
是否将其视为单一特权?还是等于为每个表制作一个GRANT SELECT ON MyTable TO MyUser
?
例如,我想知道这项工作是否可行:
GRANT SELECT ANY TABLE TO PUBLIC;
REVOKE ALL ON MY_TABLE FROM PUBLIC;
在查询之后,我仍然可以从任何用户访问MY_TABLE
吗?
答案 0 :(得分:3)
是的,所有用户仍然可以查询MY_TABLE
。
您正在寻找不同的privilege types:
用户特权的主要类型如下:
- 系统特权-系统特权使用户能够执行特定操作,或对特定类型的任何架构对象执行操作。例如,系统特权
CREATE TABLE
允许用户在与该用户关联的架构中创建表,而系统特权CREATE USER
允许用户创建数据库用户。- 对象特权-对象特权使用户能够对特定模式对象执行特定操作。不同类型的模式对象可使用不同的对象特权。从
EMPLOYEES
表中选择行或从DEPARTMENTS
表中删除行的特权是对象特权的示例。
SELECT ANY TABLE
是系统特权,允许被授予者:
以除
SYS
之外的任何模式查询表,视图或实例化视图。使用SELECT ... FOR UPDATE
获取行锁。
当您授予它是独立的单一特权时,在dba_sys_privs
中可见。当Oracle决定是否允许用户访问表时,它可以首先查看系统特权,如果没有允许该特权的系统特权,则仅继续查找特定的对象特权(在dba_tab_privs
中可见)。操作正在执行。
系统特权不会转换为数据库中每个对象的单独特权-维护该特权将是可怕的,因为创建新对象将必须根据系统特权自动确定应该授予谁特权。这将意味着您无法分辨出特权与单独授予的特权之间的区别。因此,例如,如果您在特定表上显式授予了select privs,则授予该用户SELECT ANY TABLE
,然后又将他们SELECT ANY TABLE
吊销了-先前的显式授予会发生什么?
您的方案基本上相同,只是您已指定了要撤销对象的所有特权。如果只有这两个命令,那么PUBLIC
在MY_TABLE
上没有明确的特权,因此撤消实际上并没有任何作用。但是,如果已授予该表任何显式特权,则它们将被吊销。不过,这对更高级别的SELECT ANY TABLE
系统特权没有影响。
特权是累积的;撤消对特定对象的特权不会阻止对该对象的访问,它只会删除一条可能的访问路径。
顺便说一句,希望您使用了一个人为的示例,因为应该谨慎地授予这种强大的系统特权,并only when really needed。让任何用户查询数据库中的任何表都可能会给安全模型带来很大的漏洞。再次from the docs:
Oracle建议您仅将
ANY
特权授予受信任的用户
和
Oracle建议不要向
PUBLIC
授予系统特权。
并在the database security guide中阅读更多内容。