Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 设置角色未按预期工作_Sql_Oracle_Plsql_Oracle11g_Roles - Fatal编程技术网

Sql 设置角色未按预期工作

Sql 设置角色未按预期工作,sql,oracle,plsql,oracle11g,roles,Sql,Oracle,Plsql,Oracle11g,Roles,我有个问题设置角色未按预期工作。我有一个代码示例: 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_CU

我有个问题<代码>设置角色未按预期工作。我有一个代码示例:

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\u角色
已授予
SOME\u包
。当我运行这个块时,我得到一个错误,即包不存在。当我运行此程序时,一切正常:

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;

我尝试了
executeimmediate
DBMS\u SESSION.SET\u ROLE
DBMS\u实用程序.exec\u ddl\u语句
而不是
DBMS\u SQL.EXECUTE
。有谁能告诉我一些解决方法或解释为什么会发生这种情况。

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

您已经有了一个解决方案:

  • 做两个巨大的方块

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


  • 但在设置角色后,有没有办法重新解析匿名块?我想让第一个选项起作用,因为这样我就不必重新制作超过900个组件:)唯一的选项是在执行之前设置角色。如果此块是您不控制的应用程序的一部分,则可以使用onlogon触发器设置适当的权限。还有一件事如果所有900个组件看起来都一样,您可以编写一个到“立即执行”解决方案的转换器。感谢您的回答,我决定制作一个脚本,将一个相邻的块一分为二。