根据文档“Oracle 数据库提供了 ALL PRIVILEGES 快捷方式,用于授予表 18-1 中列出的所有系统权限,SELECT ANY DICTIONARY 权限除外。”您的示例不是系统特权,因此没有重叠。 https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9013.htm
对于GRANT ANY PRIVILEGE,这授予用户依次授予其他用户系统权限的能力。例如:
dba@db> GRANT GRANT ANY PRIVILEGE to some_user;
grant succeeded
以 some_user 身份重新连接。此用户现在可以将系统授权传递给 some_other_user。
some_user@db> GRANT COMMENT ANY TABLE to some_other_user;
grant succeeded
这似乎是您想要授予用户部分 dba 权限并且应谨慎使用时要使用的权限。
相比之下,ALL PRIVILEGES 更像是一个宏,它一次授予所有单个系统权限,所以
GRANT ALL PRIVILEGES to some_user;
就像为所有系统权限运行授权语句(并且有很多):
GRANT ADVISOR TO some_user;
GRANT ADMINISTER SQL TUNING SET TO some_user;
GRANT ADMINISTER ANY SQL TUNING SET TO some_user;
GRANT CREATE ANY SQL PROFILE TO some_user;
GRANT DROP ANY SQL PROFILE TO some_user;
GRANT ALTER ANY SQL PROFILE TO some_user;
etc...
编辑:
在上面的链接中,在 grant_object_privileges 部分下还有:
所有[特权]
指定 ALL 以授予您拥有的对象的所有权限
被授予 GRANT OPTION。拥有架构的用户
包含对象自动拥有该对象的所有权限
使用 GRANT 选项。为语义提供关键字 PRIVILEGES
清晰度,是可选的。
如果你做类似的事情
GRANT ALL PRIVILEGES on some_table TO some_user;
该用户获得所有这些表权限(至少这是我在 12c 中获得的列表):
FLASHBACK
DEBUG
QUERY REWRITE
ON COMMIT REFRESH
READ
REFERENCES
UPDATE
SELECT
INSERT
INDEX
DELETE
ALTER
对于你得到的序列:
SELECT
ALTER
(并且其他对象类型将有自己的列表。)
因此,它就像系统权限的 ALL PRIVILEGES 一样,因为它是授予指定对象类型的所有对象权限的快捷方式;您没有获得任何“ALL PRIVILEGES”特权。对于表,这就像为上面列出的 12 种权限输入授权语句:
GRANT FLASHBACK on ...
GRANT DEBUG on ...
GRANT QUERY REWRITE on ...
这些权限中的每一项都可以单独撤销。所以如果你这样做了:
REVOKE INSERT, UPDATE, DELETE on some_table FROM some_user;
您仍将拥有上表权限中的其他 9 项权限。
如果您在 REVOKE 中使用“ALL PRIVILEGES”:
REVOKE ALL PRIVILEGES on some_table FROM some_user;
它将带走 some_user 在上面列表中的 some_table 上剩余的任何表权限。
所以,长话短说,这里有一个 SQL 示例来显示您原始问题的答案(表 T 的所有者是 USERT):
SQL> create table t (a varchar2(1));
Table created.
SQL> grant select on t to userA;
Grant succeeded.
SQL> select grantor
2 , grantee
3 , table_schema
4 , table_name
5 , privilege
6 from all_tab_privs
7 where table_name = 'T'
8 order by grantee;
GRANTOR GRANTEE TABLE_SCHEMA TABLE_NAME PRIVILEGE
---------- ---------- ------------ ---------- --------------------
USERT USERA USERT T SELECT
SQL>
SQL> grant select on t to roleA;
Grant succeeded.
SQL> select grantor
2 , grantee
3 , table_schema
4 , table_name
5 , privilege
6 from all_tab_privs
7 where table_name = 'T'
8 order by grantee;
GRANTOR GRANTEE TABLE_SCHEMA TABLE_NAME PRIVILEGE
---------- ---------- ------------ ---------- --------------------
USERT ROLEA USERT T SELECT
USERT USERA USERT T SELECT
SQL> grant select on t to public;
Grant succeeded.
SQL> select grantor
2 , grantee
3 , table_schema
4 , table_name
5 , privilege
6 from all_tab_privs
7 where table_name = 'T'
8 order by grantee;
GRANTOR GRANTEE TABLE_SCHEMA TABLE_NAME PRIVILEGE
---------- ---------- ------------ ---------- --------------------
USERT PUBLIC USERT T SELECT
USERT ROLEA USERT T SELECT
USERT USERA USERT T SELECT
SQL> grant all privileges on t to userA;
Grant succeeded.
SQL> select grantor
2 , grantee
3 , table_schema
4 , table_name
5 , privilege
6 from all_tab_privs
7 where table_name = 'T'
8 order by grantee;
GRANTOR GRANTEE TABLE_SCHEMA TABLE_NAME PRIVILEGE
---------- ---------- ------------ ---------- --------------------
USERT PUBLIC USERT T SELECT
USERT ROLEA USERT T SELECT
USERT USERA USERT T INDEX
USERT USERA USERT T INSERT
USERT USERA USERT T ALTER
USERT USERA USERT T SELECT
USERT USERA USERT T FLASHBACK
USERT USERA USERT T DELETE
USERT USERA USERT T REFERENCES
USERT USERA USERT T READ
USERT USERA USERT T ON COMMIT REFRESH
USERT USERA USERT T QUERY REWRITE
USERT USERA USERT T DEBUG
USERT USERA USERT T UPDATE
14 rows selected.
SQL> REVOKE ALL PRIVILEGES on T from userA;
Revoke succeeded.
SQL> select grantor
2 , grantee
3 , table_schema
4 , table_name
5 , privilege
6 from all_tab_privs
7 where table_name = 'T'
8 order by grantee;
GRANTOR GRANTEE TABLE_SCHEMA TABLE_NAME PRIVILEGE
---------- ---------- ------------ ---------- --------------------
USERT PUBLIC USERT T SELECT
USERT ROLEA USERT T SELECT
因此 REVOKE ALL PRIVILEGES 命令从 userA 中删除了表 T 上的所有直接授权,但该用户仍将通过 grant select to roleA(假设 userA 已被授予角色)或 grant select to public 拥有 SELECT 权限.