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 \表)
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中的权限,则这不起作用