我有问题。 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 IMMDIATE
,DBMS_SESSION.SET_ROLE
和DBMS_UTILITY.exec_ddl_statement
而不是DBMS_SQL.EXECUTE
。任何人都可以告诉我一些解决方法或解释为什么这些东西不断发生。
答案 0 :(得分:2)
正如我所说,在运行SET ROLE之前,您无权访问SOME_PACKAGE。 在这种情况下,您的第一个脚本永远不会工作,因为pl / sql不是脚本语言, 它在运行之前编译代码。当解析器到达SOME_PACKAGE时,它会失败,因为您的用户不知道该字符串是什么。
您已经有了解决方案:
制作2个无数块
使用动态sql,如EXECUTE IMMEDIATE(运行时编译的代码)