gpt4 book ai didi

sql - DBMS_METADATA.GET_DDL 的任何替代方式

转载 作者:行者123 更新时间:2023-12-04 21:31:15 26 4
gpt4 key购买 nike

我正在开发一个用于获取 Oracle 数据库对象的 ddl 的应用程序。

使用以下查询获取数据库的对象

SELECT object_name, object_type  
FROM dba_objects
where owner = '" + alternative_schema + "'
order by object_type, object_name;

使用以下查询获取数据库对象的 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 这是不可能的。

但是有人建议用'sys'来做

所以现在我可以通过以下查询列出所有对象

select * 
from sys.all_tables
where owner ='mydb'

它返回所有在 mydb 模式下创建的对象。

但我的下一个挑战是获得ddl

如何在没有 SELECT_CATALOG_ROLE 的情况下获得 ddl?

是否可以通过任何方式执行 DBMS_METADATA.GET_DDL 而无需授予 SELECT_CATALOG_ROLE

更新:根据链接oracle Security Model

Nonprivileged users can see the metadata of only their own objects.

所以所有者不需要对get_ddl()"SELECT_CATALOG_ROLE"权限

并且我的用户是只读类型的用户,我需要最终解决方案以从只读用户(非所有者)帐户获取 DDL,该帐户不应具有 SELECT_CATALOG_ROLE

最佳答案

我们需要运行 DBMS_METADATA.GET_DDL() 的唯一场景是当我们正在使用其模式不受适当源代码控制的数据库时。这是一种糟糕的情况,也是 DBA 应该希望改善的情况。

因此,您需要让 DBA 站在您这边。如果您请求的目的是让数据库进入源代码控制,这应该很容易,也就是说,这是一次性的练习,并且正在实现安全开发实践以确保跟踪数据库的所有 future 更改在源代码控制下。

建议的方法:在非生产但具有与生产相同数据结构的数据库上工作。这应该比在生产环境中要求提升权限更容易推销。

理想情况下它应该已经可用(UAT,Pre-prod 环境)但是如果您需要使用 DBMS_METADATA.GET_DDL() 可能您在没有这样的环境的情况下工作。在这种情况下,您需要 DBA 为您创建一个新数据库。


@AlexPoole 提出了一个很好的建议。您可以使用 sqlfile 选项通过 Data Pump 使用元数据导出来生成源文件。 Find out more .

关于sql - DBMS_METADATA.GET_DDL 的任何替代方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50941485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com