Sql ORA-00904:;DBMS“U元数据”&引用;获取“DDL”:无效的标识符
我得到ORA-00904:“DBMS_元数据”。“get_DDL”:运行DBMS_元数据时出现无效标识符错误 该错误是因为列名称或别名错误。我不知道为什么我会得到它 下面是一些显示错误的代码:我创建了一个表:Sql ORA-00904:;DBMS“U元数据”&引用;获取“DDL”:无效的标识符,sql,oracle,dbms-metadata,Sql,Oracle,Dbms Metadata,我得到ORA-00904:“DBMS_元数据”。“get_DDL”:运行DBMS_元数据时出现无效标识符错误 该错误是因为列名称或别名错误。我不知道为什么我会得到它 下面是一些显示错误的代码:我创建了一个表: create table test_table ( column1 varchar2(300)); 我插入一行数据: insert into test_table values (55); 我尝试获取它的DDL: SELECT DBMS_METADATA.GET_DDL('TAB
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';
我的用户(aka schema)在该列表中
以下是我相信的文档:以SYS的形式运行此命令:
grant execute on sys.dbms_metadata to public;
授予特定用户访问权限可能已经解决了当前的问题,但该软件包确实需要可供整个系统使用。许多第三方程序依赖于DBMS\u元数据
。默认情况下,该软件包应授予PUBLIC
一些旧版本的STIG(安全技术实现指南,几乎每个审计员都将其作为安全脚本的基础)将撤销对公共包的访问。但即使在10年前,这也是一个愚蠢的想法,而且现在的STIGs中已经没有了。可能是不同的用户。您可以显式地声明拥有表的用户
SELECT DBMS_METADATA.GET_DDL('table','test_table','XYZ')代码>我希望就是这样。我已经尝试显式地编写用户。我得到了同样的错误。我假设您依赖于行“具有SELECT\u CATALOG\u角色的用户可以查看所有对象”。这是真的。。。但即使没有DDL,您也可以为自己的对象获取DDL。但是,您仍然需要对dbms\u元数据
包具有执行权限。你有这个特权吗?(您可能还需要将其称为sys.dbms_metadata
,但应该有一个公共同义词,以避免使用模式前缀。)谢谢@AlexPoole。如何授予dbms_元数据包上的执行权限?当然要使用您的实际姓名,将dbms_元数据上的执行权限授予xyz
。特权用户(即DBA)必须这样做;显然,您不能授予自己特权*8-)