1 /据我所知,直接privilege
授权和ROLE
授权和PUBLIC
授权是独立的,这意味着所有3个授权都可以拥有相同的特权。撤销一个不会干扰仍然留在用户的特权。
这意味着我们
GRANT SELECT ON T TO userA
GRANT SELECT ON T TO roleA; GRANT roleA to userA
GRANT SELECT on T TO PUBLIC
撤销3个Grants中的一个或两个授予userA SELECT
权限。
ALL PRIVILEGES
怎么样,它与这3个区域中的任何一个重叠?如果我们有上面的3个补助金和以下
GRANT ALL PRIVILEGES on T to userA;
然后我们
REVOKE ALL PRIVILEGES on T to userA;
将额外删除3项拨款中的哪一项?系统权限和对象权限的行为是否相同?
2 /有一个GRANT ANY PRIVILEGE
和GRANT ALL PRIVILEGE*S*
。它们是一样的吗?
答案 0 :(得分:0)
根据文档" 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语句(并且有很多):
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
(其他对象类型将有自己的列表。)
因此,它就像系统特权的所有特权一样,它是授予指定对象类型的所有对象特权的快捷方式;没有一个"所有特权"你获得的特权。对于表格,它就像在上面列出的12种特权的授权声明中输入一样:
GRANT FLASHBACK on ...
GRANT DEBUG on ...
GRANT QUERY REWRITE on ...
这些特权中的每一个都可以单独撤销。所以,如果你这样做了:
REVOKE INSERT, UPDATE, DELETE on some_table FROM some_user;
您仍然拥有上述表格权限中的9个其他权限。
如果您使用"所有特权"与REVOKE:
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上的所有直接授权,但该用户仍然具有通过授予selectA到roleA的SELECT权限(假设userA已被授予角色)或者授予select to public