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不是脚本语言,
它在运行之前编译代码。当解析器到达某个_包时,它会失败,因为用户不知道该字符串是什么
您已经有了一个解决方案:
- 授予权限
- 执行函数(仅在执行第一个块后才编译此块)
但在设置角色后,有没有办法重新解析匿名块?我想让第一个选项起作用,因为这样我就不必重新制作超过900个组件:)唯一的选项是在执行之前设置角色。如果此块是您不控制的应用程序的一部分,则可以使用onlogon触发器设置适当的权限。还有一件事如果所有900个组件看起来都一样,您可以编写一个到“立即执行”解决方案的转换器。感谢您的回答,我决定制作一个脚本,将一个相邻的块一分为二。