【问题标题】:Oracle Database Script to Delete Users of Certain Role删除特定角色用户的 Oracle 数据库脚本
【发布时间】:2019-01-23 19:32:48
【问题描述】:
我正在尝试为我的 Oracle 12C 数据库编写一个脚本,该脚本允许我删除某个角色的所有用户,但似乎无法正确操作。
declare
cursor ID_CURSOR is
SELECT USERNAME
from all_users;
WHERE granted_role = 'STUDENT'
begin
for REC in ID_CURSOR loop
'DROP USER REC CASCADE';
end loop;
end;
/
【问题讨论】:
标签:
database
oracle
oracle-sqldeveloper
oracle12c
【解决方案1】:
你的主题行和你的示例光标不匹配开始。您也不能从 PL/SQL 发出 DDL。您将不得不使用立即执行。请参阅 PL/SQL 手册。
- -
因此,要查找授予特定角色的用户,您可以使用
select grantee from dba_role_privs where granted_role='ROLE_NAME'
在光标中你使用类似的东西
execute immediate 'drop user '||rec.username||' cascade;';
但是为什么要使用 PL/SQL 来做到这一点呢?如果这是一次性的工作,那么只需使用 SQL 生成 drop 语句,假脱机结果,编辑以设置 SQLPlus 设置,如“set echo on”,然后运行生成的脚本?
-- 马克 D 鲍威尔 --
【解决方案2】:
跟进 Mark 的回答 - 最简单的方法就是运行此脚本,复制并粘贴输出,然后运行它。
select 'drop user ' || grantee || ' cascade;' as script
from dba_role_privs
where granted_role = 'STUDENT';
但是,如果您真的想使用 PL/SQL,则必须这样做。我使用了一个隐式游标循环,因为它易于键入且更短。
begin
for REC in (select grantee from dba_role_privs where granted_role = 'STUDENT')
loop
execute immediate 'drop user ' || REC.grantee || ' cascade';
end loop;
end;
/