首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从包内调用DBMS_DATAPUMP所需的权限

从包内调用DBMS_DATAPUMP所需的权限
EN

Database Administration用户
提问于 2014-10-14 14:17:26
回答 3查看 20.9K关注 0票数 4

我正在尝试编写一个过程(在包中),该过程调用DBMS_DATAPUMP将现有模式复制到不同的模式中。代码在从匿名块执行时工作,但从过程中我得到以下错误。

代码语言:javascript
复制
[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_DATABASEEXP_FULL_DATABASE角色以及DBA角色。

程序代码如下。

代码语言:javascript
复制
   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模式来解决这个问题,而我不希望这样做。

EN

回答 3

Database Administration用户

回答已采纳

发布于 2014-10-14 21:08:31

简单回答:必须明确地将CREATE TABLE授予对象所有者,以便在包或存储过程中调用DBMS_DATAPUMP

较长的答覆:

为了解决这个问题,我查询了数据字典,以获得IMP_FULL_DATABASEEXP_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

票数 6
EN

Database Administration用户

发布于 2014-10-14 18:06:48

通过角色获得的特权在存储过程中无效。您需要向创建包的帐户授予所需的特权。

票数 0
EN

Database Administration用户

发布于 2016-01-11 05:00:46

还值得注意的是,缺少表空间配额也会产生同样的错误:

代码语言:javascript
复制
ORA-31626: job does not exist
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79

虽然如果这是原因,它会发生在两个方面的块和过程。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/80154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档