4

我们正在合理化我们的数据库用户权限,为此我们希望撤销授予所有用户(但不是特定角色)的架构中所有表的所有选择权限。

使用一些正则表达式,我尝试revoke为每个表创建一个通用表达式,例如:

从 USER1、USER2、USER3... 撤销对 TABLE1 的选择;

从 USER1、USER2、USER3... 撤销对 TABLE2 的选择;

但是,由于并非所有用户都被授予对所有表的权限,这会导致 oracle 错误:

01927. 00000 - "cannot REVOKE privileges you did not grant"

这是有道理的,但没有帮助。


我还尝试使用All_Tab_Privs获取所有表的列表,其中包含要撤销的必要授权,这很有效,但我看不出如何轻松地从中获得实际撤销权限。

SELECT * From All_Tab_Privs where grantor = 'GRANTING_USER' and grantee != 'READROLE' and grantee != 'PUBLIC' and grantee != 'SYS';

关于如何在电子表格中花费数小时而不用花费数小时来做到这一点的任何建议?我猜是一些 PL/SQL?谢谢。

4

4 回答 4

4

此类作业的一般模式是使用隐式游标返回所需的数据,然后构建 DDL 并执行它们。

begin
  for x in (select attribute_1, attribute_2 ... from ... where ...)
  loop
    execute immediate 'REVOKE ...'||x.attribute1||' etc';
  end loop;
end;
/

一个不错的选择是在 SELECT 中构建您想要执行的 SQL,然后执行它。它更容易测试,但 SQL 看起来有点笨拙。

于 2012-05-11T12:32:42.263 回答
4
-- Revoke Privs Granted to Users
BEGIN
  FOR r IN (SELECT * FROM all_tab_privs WHERE grantee IN ('USER_1', 'USER_2'))
    LOOP
      EXECUTE IMMEDIATE 'REVOKE '||r.privilege||' ON '||r.table_name||' FROM '||r.grantee;
    END LOOP;
END;
/
于 2014-06-03T15:17:31.383 回答
3

一些 PL/SQL 和动态 SQL:

begin
    for r in (SELECT * From All_Tab_Privs 
              where grantor = 'GRANTING_USER' 
              and grantee != 'READROLE' 
              and grantee != 'PUBLIC' 
              and grantee != 'SYS')
     loop
        execute immediate 'revoke '||r.privilege||' from '||r.grantee;
    end loop;
end;
于 2012-05-11T12:33:25.133 回答
2

我的数据库有一个非常有趣的情况。Oracle 自己的SQL Developer仍然列出了每个表的现有授权,尽管它们已从all_tab_privs表中消失(SELECT没有为搜索的被授权带来任何结果)。

我已经通过使用以下构造解决了这个问题:

BEGIN
  FOR r IN (SELECT owner, table_name FROM dba_tables WHERE owner IN ('owner1', 'owner2'))
    LOOP
      EXECUTE IMMEDIATE 'REVOKE ALL ON '||r.owner||'.'||r.table_name||' FROM grantee1, grantee2';
    END LOOP;
END;
/

这首先从某些所有者的每个表中选择所有所有者和表名。然后它撤销对某些受赠者的所有赠款。

好消息是,如果所选表之一的列出的受让人之一没有任何赠款,这不会失败。

请注意,这应该从管理员帐户执行,例如system,因此当前用户有权撤销对另一个用户的表的授权。

于 2016-02-17T09:01:59.777 回答