SET ROLES无法正常工作

时间:2014-04-18 10:26:18

标签: sql oracle plsql oracle11g roles

我有问题。 SET ROLE无法正常工作。我有代码示例:

DECLARE 
  ln_ln NUMBER;
  ln_1 NUMBER;
BEGIN
  ln_ln := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(ln_ln, 'SET ROLE SOME_ROLE IDENTIFIED BY SOME_PASSWORD',DBMS_SQL.NATIVE);
  ln_1 := DBMS_SQL.EXECUTE(ln_ln);
  DBMS_SQL.CLOSE_CURSOR(ln_ln);
  ln_ln := SOME_PACKAGE.SOME_FUNCTION;
END;

SOME_ROLE已授予SOME_PACKAGE。当我运行这个块时,我得到包不存在的错误。当我跑步时,一切都很好:

DECLARE
  ln_ln NUMBER;
  ln_1 NUMBER;
BEGIN
  ln_ln := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(ln_ln, 'SET ROLE SOME_ROLE IDENTIFIED BY SOME_PASSWORD',DBMS_SQL.NATIVE);
  ln_1 := DBMS_SQL.EXECUTE(ln_ln);
  DBMS_SQL.CLOSE_CURSOR(ln_ln);
END;
/
DECLARE
  ln_ln NUMBER;
BEGIN
  ln_ln := SOME_PACKAGE.SOME_FUNCTION;
END;

当我运行时,一切都很好:

DECLARE
  ln_ln NUMBER;
BEGIN
  ln_ln := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(ln_ln, 'SET ROLE SOME_ROLE IDENTIFIED BY SOME_PASSWORD',DBMS_SQL.NATIVE);
  ln_1 := DBMS_SQL.EXECUTE(ln_ln);
  DBMS_SQL.CLOSE_CURSOR(ln_ln);
  EXECUTE IMMEDIATE 'BEGIN :x := SOME_PACKAGE.SOME_FUNCTION; END;' USING OUT ln_ln;
END;

我尝试了EXECUTE IMMDIATEDBMS_SESSION.SET_ROLEDBMS_UTILITY.exec_ddl_statement而不是DBMS_SQL.EXECUTE。任何人都可以告诉我一些解决方法或解释为什么这些东西不断发生。

1 个答案:

答案 0 :(得分:2)

正如我所说,在运行SET ROLE之前,您无权访问SOME_PACKAGE。 在这种情况下,您的第一个脚本永远不会工作,因为pl / sql不是脚本语言, 它在运行之前编译代码。当解析器到达SOME_PACKAGE时,它会失败,因为您的用户不知道该字符串是什么。

您已经有了解决方案:

  1. 制作2个无数块

    • 授予权限
    • 执行函数(此块仅在执行第一个块后编译)
  2. 使用动态sql,如EXECUTE IMMEDIATE(运行时编译的代码)