我正在尝试编写一个过程(在包中),该过程调用DBMS_DATAPUMP将现有模式复制到不同的模式中。代码在从匿名块执行时工作,但从过程中我得到以下错误。
[Error] Execution (1: 1): ORA-31626: job does not exist
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_DATAPUMP", line 1137
ORA-06512: at "SYS.DBMS_DATAPUMP", line 5285
ORA-06512: at "UTILITY.MANAGE_SCHEMA", line 71
ORA-06512: at line 1这个错误是从DBMS_DATAPUMP.OPEN调用中生成的。因为它在匿名块中工作,所以我假设这实际上是一个权限问题(即需要通过一个角色授予一个或多个权限)。但是,我无法找到任何关于使用datapump所需的权限的文档。
这个问题归结为:为了使模式中的包能够调用DBMS_DATAPUMP,需要向用户/模式显式授予哪些权限?
包的所有者具有IMP_FULL_DATABASE和EXP_FULL_DATABASE角色以及DBA角色。
程序代码如下。
PROCEDURE copy_schema (p_source_schema VARCHAR2,
p_target_schema VARCHAR2,
p_asynchronous BOOLEAN := FALSE,
p_link_name VARCHAR2 := 'prddb') IS
dph NUMBER;
v_source_schema VARCHAR2 (30)
:= UPPER (DBMS_ASSERT.simple_sql_name (p_source_schema));
v_target_schema VARCHAR2 (30)
:= UPPER (DBMS_ASSERT.simple_sql_name (p_target_schema));
v_link_name VARCHAR2 (30)
:= UPPER (DBMS_ASSERT.qualified_sql_name (p_link_name));
v_job_name VARCHAR2 (30) := UPPER ('IMPORT_' || p_target_schema);
v_state VARCHAR2 (30);
BEGIN
DBMS_OUTPUT.put_line (
'Starting copy: source_schema = '
|| v_source_schema
|| '; target_schema = '
|| v_target_schema
|| '; link_name = '
|| v_link_name
|| '; job_name = '
|| v_job_name);
dph :=
DBMS_DATAPUMP.open ('IMPORT',
'SCHEMA',
v_link_name,
v_job_name);
DBMS_OUTPUT.put_line ('dph = ' || dph);
DBMS_DATAPUMP.metadata_filter (dph,
'SCHEMA_LIST',
'''' || v_source_schema || '''');
DBMS_DATAPUMP.metadata_remap (dph,
'REMAP_SCHEMA',
v_source_schema,
v_target_schema);
DBMS_DATAPUMP.set_parameter (dph, 'TABLE_EXISTS_ACTION', 'REPLACE');
DBMS_DATAPUMP.create_job_view (dph, UPPER (v_job_name || '_vw'));
DBMS_DATAPUMP.start_job (dph);
IF NOT p_asynchronous THEN
DBMS_DATAPUMP.wait_for_job (dph, v_state);
END IF;
END copy_schema;我发现一个解决方案可以创建一个调用datapump的过程,但是它通过将该过程放入SYSTEM模式来解决这个问题,而我不希望这样做。
发布于 2014-10-14 21:08:31
简单回答:必须明确地将CREATE TABLE授予对象所有者,以便在包或存储过程中调用DBMS_DATAPUMP。
较长的答覆:
为了解决这个问题,我查询了数据字典,以获得IMP_FULL_DATABASE和EXP_FULL_DATABASE角色(以及分配给这两个角色的所有角色)授予的所有对象和系统权限。试图显式授予所有2683权限导致2566次失败,但是包成功地调用了DBMS_DATAPUMP。
接下来的问题是:剩下的117个特权中的哪个是DBMS_DATAPUMP真正需要的?然后,我将剩余的权限分组,并一次撤销一个组(我假设这是一组最终需要的相关权限)。在运行了几乎所有的组之后,只保留了一组CREATE ANY特权。当我撤销那个组的时候,包就停止工作了。然后,我授予了每个这些权限,并在每次授予之后调用包。最终是CREATE ANY TABLE将功能恢复到包中。进一步的改进确定了CREATE TABLE实际上已经足够从包中调用DBMS_DATAPUMP了。
CREATE TABLE是我发现的唯一需要授予在问题中显示的过程中发现的功能的权限。其他过程/数据转换设置可能需要额外的特权。例如,dbms_datapump.create_job_view需要CREATE VIEW。在这种情况下,当特权丢失时,错误消息更合理地是ORA-01031: insufficient privileges。
发布于 2014-10-14 18:06:48
通过角色获得的特权在存储过程中无效。您需要向创建包的帐户授予所需的特权。
发布于 2016-01-11 05:00:46
还值得注意的是,缺少表空间配额也会产生同样的错误:
ORA-31626: job does not exist
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79虽然如果这是原因,它会发生在两个方面的块和过程。
https://dba.stackexchange.com/questions/80154
复制相似问题