Oracle exec从过程收集表统计信息
如果我创建一个过程:Oracle exec从过程收集表统计信息,oracle,Oracle,如果我创建一个过程: 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:无法分析表“SchameA”、“TableName”、权限不足或不存在
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:无法分析表“SchameA”、“TableName”、权限不足或不存在
。但这是可行的:
EXEC SYS.DBMS_STATS.GATHER_TABLE_STATS( 'SchameA', 'TableName', CASCADE => TRUE);
执行过程和表的用户处于不同的模式中
通过过程执行此操作时,为什么会出现错误?要在另一个架构中收集对象的统计信息,您需要
分析任何
系统权限。运行您的过程的用户似乎拥有该权限,但通过角色授予。作为:
在任何命名PL/SQL块(存储过程、,
函数(或触发器),以定义者的权限执行
您可以直接向用户授予分析任何,或创建过程,如下所示:
当您直接执行
EXEC
DBMS\u STATS过程时,它将作为匿名块运行,而且这些过程总是使用调用方的权限运行-尊重角色。如果您希望用户能够在不使用分析任何角色的情况下运行该过程,则可以将AUTHID
设置为定义者
CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS
AUTHID DEFINER IS
BEGIN
SYS.DBMS_STATS.GATHER_TABLE_STATS('SchName', 'TableName', CASCADE => TRUE);
END;
我不完全确定我是否会跟随;但您是否依赖于通过角色授予的特权,这一点?我理解,所以如何将其应用于过程?
CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS
AUTHID DEFINER IS
BEGIN
SYS.DBMS_STATS.GATHER_TABLE_STATS('SchName', 'TableName', CASCADE => TRUE);
END;