【问题标题】:Create or replace role?创建或替换角色?
【发布时间】:2010-11-14 21:31:51
【问题描述】:

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

CREATE OR REPLACE ROLE role_name;
  GRANT SELECT ON SCM1_VIEW_OBJECT_VW TO role_name;

在没有 PL/SQL 的情况下有什么方法可以做到这一点?

【问题讨论】:

    标签: sql oracle plsql roles


    【解决方案1】:

    解决方案

    给定答案和 pragma 控件的组合为 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;
    

    测试

    这个序列有效:

    DROP ROLE role_name;
    CREATE ROLE role_name;
    CALL create_role( 'role_name' );
    CALL create_role( 'role_name' );
    

    最终的创建角色语句失败,正如预期的那样:

    DROP ROLE role_name;
    CALL create_role( 'role_name' );
    CREATE ROLE role_name;
    

    【讨论】:

    • 作为一般规则,我不会将 DDL 放在函数中,您应该将其转换为过程。其次,我真的不明白自治事务的用途 - 你没有 DML 事务。
    • 从一个从 SQL 语句调用的函数内部创建一个角色似乎是一个非常糟糕的主意。愿意解释一下为什么需要它吗?
    • 仍然没有显示为什么您不能使用程序。如果你想从 SQL 中调用它,你可以使用“EXEC create_role('role_name')”。如果您从 PL/SQL 调用它,则只需“create_role('role_name')”。
    【解决方案2】:

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

    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;
    

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

    【讨论】:

    • FOUT in regel 2: .ORA-06550: line 2, column 3: PLS-00103: 在期望以下之一时遇到符号“CREATE”:...
    【解决方案3】:
    DECLARE
      v_dummy NUMBER;
    BEGIN
      SELECT 1
      INTO v_dummy
      FROM dba_roles
      WHERE role = 'MY_ROLE_NAME';
    EXCEPTION
      WHEN no_data_found THEN
        EXECUTE IMMEDIATE 'CREATE ROLE my_role_name';
    END;
    /
    

    【讨论】:

      【解决方案4】:

      角色的“创建或替换”没有语法。不确定您的 Oracle 版本,但我记得这并没有太大变化。 http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_6012.htm

      您可以多次向角色授予选择权,只要角色存在,它将每次都接受授予。

      如果角色已经存在,或者通过查询 DBA_ROLES 来查看角色是否存在,您可以执行匿名阻止并忽略执行。

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 1970-01-01
        • 2017-05-15
        • 1970-01-01
        • 1970-01-01
        • 2020-08-20
        • 2016-06-25
        • 2010-11-03
        • 1970-01-01
        相关资源
        最近更新 更多