如果我创建一个程序:
CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS IS
BEGIN
SYS.DBMS_STATS.GATHER_TABLE_STATS( 'SchName', 'TableName', CASCADE => TRUE);
END;
Run Code Online (Sandbox Code Playgroud)
并执行它;
EXEC SchameB.PRC_GATHER_STATS;
Run Code Online (Sandbox Code Playgroud)
这给了我错误ORA-20000: Unable to analyze TABLE "SchameA"."TableName", insufficient privileges or does not exist.但这有效:
EXEC SYS.DBMS_STATS.GATHER_TABLE_STATS( 'SchameA', 'TableName', CASCADE => TRUE);
Run Code Online (Sandbox Code Playgroud)
谁的用户EXECS中的程序和表在不同的模式.
为什么我在通过程序执行此操作时出错?
要收集另一个模式中对象的统计信息,您需要ANALYZE ANY系统特权.我似乎运行您的过程的用户具有该权限,但通过角色授予.正如文件所说:
在使用定义者权限执行的任何命名PL/SQL块(存储过程,函数或触发器)中禁用所有角色.
您可以GRANT ANALYZE ANY直接向您的用户,也可以创建具有调用者权限的过程,如下所示:
CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS
AUTHID CURRENT_USER IS
BEGIN
SYS.DBMS_STATS.GATHER_TABLE_STATS('SchName', 'TableName', CASCADE => TRUE);
END;
/
Run Code Online (Sandbox Code Playgroud)
当您直接执行EXEC该DBMS_STATS过程时,它将作为匿名块运行,并且始终以调用者的权限运行 - 尊重角色.
| 归档时间: |
|
| 查看次数: |
37123 次 |
| 最近记录: |