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

如何从其他Schema运行MYSCHEMA存储过程且无需修改代码

跨Schema调用存储过程的可行性问题

在MYSCHEMA Schema中创建了如下存储过程:

CREATE OR REPLACE PROCEDURE my_procedure
    IS
BEGIN
    dbms_output.put_line('Start test');
    dbms_stats.gather_table_stats(user,'TEST');
    dbms_output.put_line('End test');
END my_procedure;

TEST表仅存在于MYSCHEMA中。请问是否可以从其他Schema运行该过程,且无需将代码修改为:

dbms_stats.gather_table_stats('MYSCHEMA','TEST');

使用的Oracle数据库版本信息:

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
"CORE   12.1.0.2.0  Production"
TNS for Linux: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production

可以实现,不需要修改存储过程代码,只需完成以下配置和调用步骤:

  1. 授予执行权限
    在MYSCHEMA下给目标Schema授予该存储过程的执行权限:
GRANT EXECUTE ON my_procedure TO 目标Schema名称;
  1. 跨Schema调用
    其他Schema调用时,必须指定存储过程的所属Schema:
BEGIN
    MYSCHEMA.my_procedure;
END;
/

原因说明

Oracle存储过程默认采用定义者权限模型,即存储过程执行时会以创建它的用户(MYSCHEMA)的身份运行,而非调用者的身份。因此代码里的user关键字会返回MYSCHEMA,dbms_stats.gather_table_stats(user,'TEST')会正确定位到MYSCHEMA.TEST表,完全不需要硬写Schema名。

注意点

  • 确保MYSCHEMA本身拥有对TEST表执行统计信息收集的权限(表所有者默认拥有该权限,一般无需额外配置)。
  • 如果存储过程声明了AUTHID CURRENT_USER(调用者权限模型),user会返回调用者的Schema名,此时才会找不到TEST表需要修改代码。但你当前的存储过程没有这个声明,默认是定义者权限,完全没问题。

内容的提问来源于stack exchange,提问作者Javi Torre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:06:33