直接特权授予与ALL PRIVILEGES vs角色与PUBLIC

时间:2016-04-24 16:29:42

标签: sql oracle oracle11g database-security

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 PRIVILEGEGRANT ALL PRIVILEGE*S*。它们是一样的吗?

1 个答案:

答案 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在上面列表中so​​me_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