Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORA-00904:;DBMS“U元数据”&引用;获取“DDL”:无效的标识符_Sql_Oracle_Dbms Metadata - Fatal编程技术网

Sql ORA-00904:;DBMS“U元数据”&引用;获取“DDL”:无效的标识符

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

我得到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('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-)