【发布时间】:2018-06-20 06:20:30
【问题描述】:
我正在开发一个用于获取 Oracle 数据库对象的 ddl 的应用程序。
使用以下查询获取数据库对象
SELECT object_name, object_type
FROM dba_objects
where owner = '" + alternative_schema + "'
order by object_type, object_name;
使用以下查询获取 db 对象的 ddl
SELECT DBMS_METADATA.GET_DDL('TABLE','" + tableName + "','" + alternative_schema + "')
FROM dual;
它工作正常。
要执行上述查询 oracle 用户需要以下授权
GRANT SELECT_CATALOG_ROLE TO john;
GRANT SELECT ANY TABLE TO john;
现在由于一些安全问题,dba 不允许授予 SELECT_CATALOG_ROLE,正如我的研究表明,使用 SELECT_CATALOG_ROLE 是不可能的。 p>
但有人建议通过 'sys' 来做。
所以现在我可以通过以下查询列出所有对象
select *
from sys.all_tables
where owner ='mydb'
它返回 mydb 模式下创建的所有对象。
但我的下一个挑战是获取 ddl
没有SELECT_CATALOG_ROLE如何获得ddl?
是否可以在不授予 SELECT_CATALOG_ROLE 的情况下以任何方式执行 DBMS_METADATA.GET_DDL?
更新: 根据链接oracle Security Model
非特权用户只能看到自己对象的元数据。
所以所有者不需要拥有"SELECT_CATALOG_ROLE" 对get_ddl() 的权限
我的用户是只读类型的用户,我需要从只读用户(非所有者)帐户获取 DDL 的最终解决方案,该帐户不应该有 SELECT_CATALOG_ROLE
【问题讨论】:
-
据我所知,您确实需要
select_catalog_role。您提到的sys在这里无关紧要,因为您从all_tables中进行选择,无论如何您都可以访问它(它包含您可以访问的所有对象)。 “sys”只是说谁拥有它,但在这种情况下并不重要。 -
谢谢@Littlefoot。实际上由于安全要求,dba 不能让我们对 Oracle 数据库中的 DBA_OBJECTS 表具有选择权限。所以我们不能使用DBA_OBJECTS。那么我们是否可以通过其他任何方式来做到这一点,或者这是不可能的,这意味着我必须授予 CATALOG_ROLE 才能获得 DDL。
-
如果你必须做那份工作(因为有人(老板?)告诉过你)但因为你没有所需的权限而不能做,你必须和那个 老板 人,解释发生了什么,看看结果。要么你会得到特权(并且去做),要么你不会得到它(并且不会去做)。
-
感谢@Littlefoot 的反馈
-
不客气。祝你好运!