exec从程序中收集表统计信息

Den*_*niz 6 oracle

如果我创建一个程序:

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中的程序和表在不同的模式.

为什么我在通过程序执行此操作时出错?

Ale*_*ole 9

要收集另一个模式中对象的统计信息,您需要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)

当您直接执行EXECDBMS_STATS过程时,它将作为匿名块运行,并且始终以调用者的权限运行 - 尊重角色.