创建或替换角色?

Dav*_*vis 4 sql oracle plsql roles

您如何在 Oracle 中创建或替换角色(可能存在也可能不存在)?例如,以下不起作用:

CREATE OR REPLACE ROLE role_name;
  GRANT SELECT ON SCM1_VIEW_OBJECT_VW TO role_name;
Run Code Online (Sandbox Code Playgroud)

没有 PL/SQL 有什么方法可以做到这一点?

Jef*_*emp 5

最佳实践是尝试创建角色,然后在发生异常时优雅地处理适当的异常;这意味着您不需要运行可能昂贵的数据字典查询:

begin
  execute immediate 'create role role_name';
exception
  when others then
    --"ORA-01921: role name 'x' conflicts with another user or role name"
    if sqlcode = -01921 then 
      null;
    else
      raise;
    end if;
end;
Run Code Online (Sandbox Code Playgroud)

是的,您需要 PL/SQL 来完成这项工作 - 无论如何,它是完成这项工作的最佳工具。


Dav*_*vis 5

解决方案

给定答案和编译指示控件的组合可为 Oracle 10g 完成此任务。

CREATE OR REPLACE PROCEDURE create_role( role_name IN VARCHAR2 ) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  EXECUTE IMMEDIATE 'CREATE ROLE '||role_name;
EXCEPTION
  WHEN OTHERS THEN
    -- ORA-01921: If The role name exists, ignore the error.
    IF SQLCODE <> -01921 THEN
      RAISE;
    END IF;
END create_role;
Run Code Online (Sandbox Code Playgroud)

测试

此序列有效:

DROP ROLE role_name;
CREATE ROLE role_name;
CALL create_role( 'role_name' );
CALL create_role( 'role_name' );
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,最终的 create role 语句失败:

DROP ROLE role_name;
CALL create_role( 'role_name' );
CREATE ROLE role_name;
Run Code Online (Sandbox Code Playgroud)