为何引用其他Schema表的PL/SQL存储过程权限表现不同?
静态CURSOR跨Schema表权限不足,动态SQL却正常执行的原因
我有两个PL/SQL存储过程:第一个通过静态CURSOR引用其他Schema的表,执行时提示权限不足;第二个通过动态SQL引用相同的表,却能正常执行。请问这是什么原因?
第一个报错的存储过程代码
CREATE SCHEMA1.PROCEDURE proc1 AS TYPE Record1 IS RECORD (v_one VARCHAR2(20), v_two VARCHAR2(20)); CURSOR procCursor RETURN Record1 IS SELECT P.CODE, R.DESCRIPTION FROM SCHEMA2.ROLES771 R, SCHEMA2.ROLEP773 P WHERE ...; BEGIN ... END SCHEMA1.PROCEDURE;
第二个正常执行的存储过程代码
CREATE SCHEMA1.PROCEDURE proc1 AS TYPE Record1 IS RECORD (v_one VARCHAR2(20), v_two VARCHAR2(20)); CURSOR procCursor RETURN Record1 IS SELECT P.CODE, R.DESCRIPTION FROM TMP_TBL; BEGIN EXECUTE IMMEDIATE ('TRUNCATE TABLE TMP_TBL'); EXECUTE IMMEDIATE (' INSERT INTO TMP_TBL (ONE, TWO) SELECT P.CODE, R.DESCRIPTION FROM SCHEMA2.ROLES771 R, SCHEMA2.ROLEP773 P'); ... END SCHEMA1.PROCEDURE;
原因分析
- 静态SQL的权限检查逻辑:静态CURSOR属于静态SQL范畴,权限校验在存储过程编译阶段完成。此时仅认可存储过程所有者(SCHEMA1)直接被授予的权限,通过角色(如DBA、CONNECT等)间接授予的权限不会被识别。如果SCHEMA1访问SCHEMA2表的权限来自角色而非直接授予,静态CURSOR就会触发权限不足报错。
- 动态SQL的权限检查逻辑:
EXECUTE IMMEDIATE属于动态SQL,权限校验发生在运行阶段。此时会校验执行用户(默认是存储过程所有者SCHEMA1)的所有有效权限,包括通过角色授予的权限。因此即便SCHEMA1的跨表访问权来自角色,动态SQL也能正常执行。
内容的提问来源于stack exchange,提问作者Marcello Manfredini
相关产品推荐
相关产品推荐

