如果我创建一个程序:
CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS IS BEGIN SYS.DBMS_STATS.GATHER_TABLE_STATS( 'SchName','TableName',CASCADE => TRUE); END;
并执行它;
EXEC SchameB.PRC_GATHER_STATS;
这给了我错误ORA-20000:无法分析TABLE“SchameA”.“TableName”,权限不足或不存在.但这有效:
EXEC SYS.DBMS_STATS.GATHER_TABLE_STATS( 'SchameA',CASCADE => TRUE);
执行过程和表的用户使用不同的模式.
为什么我在通过程序执行此操作时出错?
要收集另一个模式中的对象的统计信息,您需要ANALYZE ANY系统特权.我似乎运行您的过程的用户具有该权限,但通过角色授予.如
the documentation says:
All roles are disabled in any named PL/sql block (stored procedure,
function,or trigger) that executes with definer’s rights.
您可以直接向用户进行GRANT ANALYZE ANY,也可以创建程序with invoker’s rights,如下所示:
CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS AUTHID CURRENT_USER IS BEGIN SYS.DBMS_STATS.GATHER_TABLE_STATS('SchName',CASCADE => TRUE); END; /
当您直接执行DBMS_STATS过程时,它将作为匿名块运行,并且始终以调用者的权限运行 – 尊重角色.