创建或替换角色?

时间:2009-07-28 23:12:09

标签: sql oracle plsql roles

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

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

没有PL / SQL的任何方法吗?

4 个答案:

答案 0 :(得分:4)

<强>解决方案

给定答案和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' );

最终的create role语句失败,正如所料:

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

答案 1 :(得分:3)

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

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才能做到这一点 - 无论如何,它是这项工作的最佳工具。

答案 2 :(得分:2)

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;
/

答案 3 :(得分:1)

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

您可以多次向该角色授予选择权,并且每当角色存在时,它都会接受该授权。

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