Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle exec从过程收集表统计信息_Oracle - Fatal编程技术网

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;