关于oracle角色和我的架构创建代码,我有一个奇怪的问题,我会尽力描述下面的问题:
在架构创建时,使用提供的架构名称创建角色。
EXECUTE IMMEDIATE 'CREATE ROLE ' || USER || 'ADMIN_R';
然后,将此角色授予与该架构关联的特定用户。
DECLARE
V_ROLE_NAME CONSTANT VARCHAR2(30) := USER || 'ADMIN_R';
CURSOR C_ADMIN_USERS IS
SELECT USERNAME FROM DBUSERS WHERE ROLE = 'ADMINISTRATION';
BEGIN
FOR REC IN C_ADMIN_USERS
LOOP
EXECUTE IMMEDIATE 'GRANT ' || V_ROLE_NAME || ' TO ' || REC.USERNAME || ' WITH ADMIN OPTION';
END LOOP;
END;
具有此角色的用户可以访问特殊管理包。
EXECUTE IMMEDIATE 'GRANT EXECUTE ON P_ADMINISTRATION TO ' || USER || 'ADMIN_R';
问题是当我删除模式时它不会删除此角色(属于oracle),因此当我重新创建此模式时,整个过程将失败,因为此角色已存在。如果不登录我想避免的系统用户,我也无法授予对此角色的访问权限。简单的解决方案就是删除它,但我在那个实例中的关注点是DBA一直在使用该角色授予对其他用户和可能的附加包的访问权限,如果我们只是随意删除角色来重新创建,那么这些包都会丢失它
非常感谢任何帮助。
答案 0 :(得分:0)
您可以使用以下内容围绕您的角色创建:
Array.prototype.splice
您可以根据需要多次授予相同的权限。
答案 1 :(得分:0)
您可以在创建
之前删除该角色declare
i int;
begin
select count(*) into i
from dba_roles where role = USER||'ADMIN_R';
if (0 != i) then
execute immediate 'drop role '||USER||'ADMIN_R';
dbms_output.put_line('Role ' ||USER||'ADMIN_R has been dropped');
end if;
execute immediate 'create role '||USER||'ADMIN_R';
dbms_output.put_line('Role ' ||USER||'ADMIN_R has been created');
end;
第一次尝试:
Role SCMADMIN_R has been created
第二次尝试:
Role SCMADMIN_R has been dropped
Role SCMADMIN_R has been created