ORA-00904: "DBMS_METADATA"."GET_DDL": 标识符无效

Posted

技术标签:

【中文标题】ORA-00904: "DBMS_METADATA"."GET_DDL": 标识符无效【英文标题】:ORA-00904: "DBMS_METADATA"."GET_DDL": invalid identifier 【发布时间】:2019-05-17 14:02:45 【问题描述】:

运行 dbms_metadata 时出现 ORA-00904: "DBMS_METADATA"."GET_DDL": invalid identifier 错误。

该错误是因为列名或别名错误。我不确定我为什么会得到它。

这里是一些显示错误的代码:我创建了一个表:

create table test_table (
   column1 varchar2(300));

我插入一行数据:

insert into test_table values (55);

我尝试为它获取 DDL:

SELECT DBMS_METADATA.GET_DDL('TABLE','test_table') FROM dual;

这是错误:

>> SELECT DBMS_METADATA.GET_DDL('TABLE','test_table') FROM dual
       *
Error at line 1
ORA-00904: "DBMS_METADATA"."GET_DDL": invalid identifier

我检查了权限,看来我拥有正确的权限:

select * FROM DBA_ROLE_PRIVS where granted_role = 'SELECT_CATALOG_ROLE';

我的用户(又名架构)在该列表中。

以下是我认为的文档:https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_metada.htm#i1016867

【问题讨论】:

可能是不同的用户。您可以明确声明拥有该表的用户SELECT DBMS_METADATA.GET_DDL('TABLE','test_table', 'XYZ') FROM dual; 我希望就是这样。我试过明确写用户。我得到同样的错误。 我假设您依赖于“具有 SELECT_CATALOG_ROLE 的用户可以看到所有对象”这一行。这是真的......但即使没有它,您也可以为您自己的对象获取 DDL。但是,您仍然需要对 dbms_metadata 包的执行权限。你有这个特权吗? (您可能还需要将其称为sys.dbms_metadata,但应该有一个公共同义词以避免需要架构前缀。) 感谢@AlexPoole。如何授予对 dbms_metadata 包的执行权限? grant execute on dbms_metadata to xyz,当然使用您的真实姓名。特权用户(即 DBA)必须这样做;你不能授予自己特权,显然 *8-) 【参考方案1】:

以 SYS 身份运行此命令:

grant execute on sys.dbms_metadata to public;

向您的特定用户授予访问权限可能已经解决了您当前的问题,但该软件包确实需要可供整个系统使用。许多第三方程序依赖于DBMS_METADATA。默认情况下,该包应授予PUBLIC

一些旧版本的 STIG(安全技术实施指南,几乎每个审核员都将其用作其安全脚本的基础)会撤销对公共包的访问权限。但即使在 10 年前,这也是一个愚蠢的想法,反正现在的 STIG 中已经没有了。

【讨论】:

以上是关于ORA-00904: "DBMS_METADATA"."GET_DDL": 标识符无效的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00904: "FORMAT": 无效标识符

ORA-00904: "CEILING": ORACLE 11G 中的标识符无效

ORA-00904: "DAYS": 无效标识符

ORA-00904: "pass": 无效的标识符

ORA-00904: "PREV_TEMP": 带有 LAG 函数的无效标识符

SQL 错误:ORA-00904:“GENDER”:无效标识符 00904。00000 -“%s:无效标识符”