我正在尝试为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;
/
答案 0 :(得分:2)
您的主题行和示例光标不匹配,因此无法开始。您也不能从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”),然后运行生成的脚本? --Mark D Powell-
答案 1 :(得分:1)
紧跟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;
/