首批通过分布式安全可靠测评,为关键业务系统打造
Oracle 模式下普通用户无法通过 dbms_metadata.get_ddl() 获取对象的 DDL,错误代码 ORA-00942
更新时间:2023-12-07 03:16
普通用户使用 dbms_metadata.get_ddl 函数包获取表的 DDL 报 ORA-00942 错误。本文介绍该问题的原因以及解决方法。
适用版本
OceanBase 数据库 V2.2.7x 版本
问题现象
普通用户使用 dbms_metadata.get_ddl 函数包获取表的 DDL,以下命令执行错误,错误信息如下。
obclient> SELECT dbms_metadata.get_ddl('TABLE','TMP_BM_XTCS','CHZ') FROM dual;
ORA-00942: table or view does not exis
可能原因
由于 OceanBase 数据库在 V2.2.7x 版本增加了角色权限,因此考虑问题可能是由于用户权限不足引起的。查看 DDL 语句需要查询字典视图,因此需要 SELECT ANY DICTIONARY 权限。
执行以下语句查询用户的权限。其中,grantee='xxxx' 为用户名。
obclient> SELECT * FROM dba_sys_privs WHERE grantee='XXXX';
发现该用户没有 SELECT ANY DICTIONARY 权限。

解决方式
授予普通用户 SELECT ANY DICTIONARY 权限。然后,普通用户可以使用查看 dbms_metadata.get_ddl 系统包函数查看对象 DDL。
其中 user_name 表示用户名。
GRANT SELECT ANY DICTIONARY TO <user_name>;