Sql 甲骨文:你如何清理用户的每一笔授权?

Sql 甲骨文:你如何清理用户的每一笔授权?,sql,oracle,plsql,Sql,Oracle,Plsql,我正在寻找一种快速简便的方法来撤销用户对表、视图等的所有特权。有什么简单的魔法可以做到这一点吗 这样做的目的是重新开始应该具有的访问权限。当您了解用户拥有哪些权限时,例如 SQL> select * From user_sys_privs; USERNAME PRIVILEGE ADM ------------------------------ ------------------

我正在寻找一种快速简便的方法来撤销用户对表、视图等的所有特权。有什么简单的魔法可以做到这一点吗


这样做的目的是重新开始应该具有的访问权限。

当您了解用户拥有哪些权限时,例如

SQL> select * From user_sys_privs;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
SCOTT                          CREATE DATABASE LINK                     NO
SCOTT                          CREATE ROLE                              NO
SCOTT                          CREATE VIEW                              NO
SCOTT                          CREATE TYPE                              NO
SCOTT                          CREATE PROCEDURE                         NO
SCOTT                          UNLIMITED TABLESPACE                     NO
SCOTT                          CREATE PUBLIC SYNONYM                    NO
SCOTT                          CREATE TABLE                             NO
SCOTT                          CREATE TRIGGER                           NO
SCOTT                          CREATE SEQUENCE                          NO
SCOTT                          CREATE SESSION                           NO

11 rows selected.

SQL>
然后编写查询,该查询将为您编写一些代码:

SQL> select 'revoke ' || privilege || ' from scott;'
  2  from user_sys_privs;

'REVOKE'||PRIVILEGE||'FROMSCOTT;'
--------------------------------------------------------
revoke CREATE DATABASE LINK from scott;
revoke CREATE VIEW from scott;
revoke CREATE ROLE from scott;
revoke UNLIMITED TABLESPACE from scott;
revoke CREATE PROCEDURE from scott;
revoke CREATE TYPE from scott;
revoke CREATE PUBLIC SYNONYM from scott;
revoke CREATE TABLE from scott;
revoke CREATE TRIGGER from scott;
revoke CREATE SESSION from scott;
revoke CREATE SEQUENCE from scott;

11 rows selected.

SQL>
现在复制/粘贴那些
revoke
语句并运行它们


然而,这还不是全部。用户可以拥有其他特权,因此作为特权用户,可以查询
DBA\u SYS\u PRIVS
DBA\u ROLE\u PRIVS
DBA\u TAB\u PRIVS

为了不想太多:),看看是怎么做到的。这个脚本可以追溯到2003年,但是-它会告诉你怎么做


此外,可能最简单的方法是删除该用户(但我想这不是一个选项)

我一直在想有什么办法可以撤销所有的命令

唉,没有。特权被原子地撤销(和授予),这是它应该的方式。想要撤销一个用户的所有特权是同一种心态的产物,这首先会导致授予太多和/或太强大的特权

有三类被授予的特权:

  • 角色
  • 系统(创建表、创建会话等)
  • 对象访问(其他模式中的表、视图、过程等)
每个视图在数据字典上都有一组不同的视图

  • 用户角色权限(也包括所有权限、DBA权限)
  • 用户系统权限(也包括所有权限、DBA权限)
  • 用户\表\权限(也包括所有\表、DBA \表)
我们可以使用这些视图生成REVOKE语句。作为有问题的用户,这样做似乎很奇怪。因此,超级用户(即DBA)执行如下操作:

begin

    dbms_output.put_line('Revoking granted roles ...');

    for r in ( select * from dba_role_privs
               where grantee = 'JOESOAP' )
    loop
        dbms_output.put_line('revoke ' || r.granted_role ||' from ' || r.grantee ||';');
    end loop;

    dbms_output.put_line('Revoking granted system privileges ...');

    for r in ( select * from dba_sys_privs
               where grantee = 'JOESOAP' )
    loop
        dbms_output.put_line('revoke ' || r.privilege ||' from ' || r.grantee ||';');
    end loop;

    dbms_output.put_line('granted access privileges ...');

    for r in ( select * from dba_tab_privs
               where grantee = 'JOESOAP' )
    loop
        dbms_output.put_line('revoke ' || r.privilege || ' on ' || r.owner||'.'||r.table_name ||' from ' || r.grantee ||';');
    end loop;

end;
/
这将把命令输出到屏幕上-使用像SQL Developer这样的IDE来降低难度-您可以查看并保存为可执行脚本。我建议您这样做,而不是让循环立即执行,因为您需要记录您所使用的特权,还需要阻止您意外取消授权某些东西或某些人,这些东西或某些人稍后可能会回来咬您


事实上,与其撤销所有特权并重新授予其中一些特权,不如查看用户拥有的所有特权,并撤销不应授予的特权

非常感谢你这么做。我一直在想,在Oracle文档中找不到某种撤销所有命令。我是一个相当新的Oracle DBA。@Phillip:你应该重新考虑如何授予特权。您可能希望将它们捆绑到角色中,然后只需要撤销角色,而不是单独撤销每个特权。但是,如果用户需要PL/SQL中的权限,则这不起作用