You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何引用其他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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:32:51