【问题标题】:dbms_datapump.get_dumpfile_info can't read directory when compiled in stored proceduredbms_datapump.get_dumpfile_info 在存储过程中编译时无法读取目录
【发布时间】:2018-11-21 18:51:03
【问题描述】:

我正在创建一个存储过程来加载 (impdp) Datapump 数据库转储。

我正在尝试使用 DBMS_DATAPUMP.GET_DUMPFILE_INFO, like in this example 获取转储文件的创建日期(与之前加载的转储日期进行比较)。

在匿名块中运行时(如下所示),它运行良好,输出转储文件的创建日期。但是,当在存储过程中调整和编译同一块时,我收到 ORA-39087 错误(目录名称无效)。

DECLARE 
  dumpfile VARCHAR2(256) := 'my_file.dp';
  dir VARCHAR2(30) := 'MY_DIR';
  info ku$_dumpfile_info;
  ft NUMBER;
BEGIN
  sys.dbms_datapump.get_dumpfile_info(dumpfile, dir, info, ft);
  FOR rec IN (SELECT * FROM TABLE (info) WHERE item_code = 6 ) LOOP 
    dbms_output.put_line(rec.value);
  END LOOP;
END;

目录存在。名称有效。当我跑步时

SELECT * FROM datapump_dir_objs;

对于同一个用户,我可以看到该用户对该目录具有 READ 和 WRITE 权限。 Oracle 版本为 11g Release 11.2.0.4.0。

我做错了什么?

提前致谢。

【问题讨论】:

  • 用户是否拥有直接授予他们或通过角色授予的读写权限? (一种快速检查方法是查看您的查询在您执行set role none 后是否仍显示相同的数据。)
  • 感谢@AlexPoole!权限由角色授予。我在程序的标题中添加了AUTHID CURRENT_USER,一切正常。

标签: oracle plsql directory datapump


【解决方案1】:

问题是目录的 READ 和 WRITE 权限是通过角色添加的。默认情况下,匿名块以当前用户的权限执行,但存储过程不是。

我将AUTHID CURRENT_USER 添加到过程的标题中并设法访问我的目录。

感谢 Alex Poole 提供的见解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2020-06-01
    • 1970-01-01
    相关资源
    最近更新 更多