oracle - 如何生成 Oracle 模式的整个 DDL(可编写脚本)?

标签 oracle schema ddl

谁能告诉我如何为 Oracle 模式内的所有表、 View 、索引、包、过程、函数、触发器、类型、序列、同义词、授权等生成 DDL?理想情况下,我也想复制行,但这不太重要。

我想在某种预定的作业上执行此操作,而不是每次都手动执行,因此排除在 SQL Developer 中使用向导的可能性。

理想情况下,由于我将在几个相互授予和同义词的模式上运行它,我希望有一种方法可以在输出中进行查找/替换,以便模式名称与我的新模式的名称相匹配成为。

谢谢!

最佳答案

您可以通过 SQL*Plus 和 dbms_metadata 包将模式假脱机到一个文件中。然后通过 sed 将模式名称替换为另一个名称。这适用于 Oracle 10 及更高版本。

sqlplus<<EOF
set long 100000
set head off
set echo off
set pagesize 0
set verify off
set feedback off
spool schema.out

select dbms_metadata.get_ddl(object_type, object_name, owner)
from
(
    --Convert DBA_OBJECTS.OBJECT_TYPE to DBMS_METADATA object type:
    select
        owner,
        --Java object names may need to be converted with DBMS_JAVA.LONGNAME.
        --That code is not included since many database don't have Java installed.
        object_name,
        decode(object_type,
            'DATABASE LINK',      'DB_LINK',
            'JOB',                'PROCOBJ',
            'RULE SET',           'PROCOBJ',
            'RULE',               'PROCOBJ',
            'EVALUATION CONTEXT', 'PROCOBJ',
            'CREDENTIAL',         'PROCOBJ',
            'CHAIN',              'PROCOBJ',
            'PROGRAM',            'PROCOBJ',
            'PACKAGE',            'PACKAGE_SPEC',
            'PACKAGE BODY',       'PACKAGE_BODY',
            'TYPE',               'TYPE_SPEC',
            'TYPE BODY',          'TYPE_BODY',
            'MATERIALIZED VIEW',  'MATERIALIZED_VIEW',
            'QUEUE',              'AQ_QUEUE',
            'JAVA CLASS',         'JAVA_CLASS',
            'JAVA TYPE',          'JAVA_TYPE',
            'JAVA SOURCE',        'JAVA_SOURCE',
            'JAVA RESOURCE',      'JAVA_RESOURCE',
            'XML SCHEMA',         'XMLSCHEMA',
            object_type
        ) object_type
    from dba_objects 
    where owner in ('OWNER1')
        --These objects are included with other object types.
        and object_type not in ('INDEX PARTITION','INDEX SUBPARTITION',
           'LOB','LOB PARTITION','TABLE PARTITION','TABLE SUBPARTITION')
        --Ignore system-generated types that support collection processing.
        and not (object_type = 'TYPE' and object_name like 'SYS_PLSQL_%')
        --Exclude nested tables, their DDL is part of their parent table.
        and (owner, object_name) not in (select owner, table_name from dba_nested_tables)
        --Exclude overflow segments, their DDL is part of their parent table.
        and (owner, object_name) not in (select owner, table_name from dba_tables where iot_type = 'IOT_OVERFLOW')
)
order by owner, object_type, object_name;

spool off
quit
EOF

cat schema.out|sed 's/OWNER1/MYOWNER/g'>schema.out.change.sql

将所有内容放在脚本中并通过 cron(调度程序)运行它。使用高级功能时,导出对象可能会很棘手。如果您需要向上述代码添加更多异常(exception),请不要感到惊讶。

关于oracle - 如何生成 Oracle 模式的整个 DDL(可编写脚本)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10886450/

相关文章:

oracle - 在oracle中创建空间数据库时无法更新user_sdo_geom_metadata

json - $ref 不适用于数组类型 json 模式

sql - 在 Oracle 中创建一个列具有默认值的表

django 手动将模型字段添加到 postgres 数据库

mysql - 如何在 MySQL 中为数据库起别名?

sql - 有什么方法可以在 PostgreSQL 的单个查询中创建触发器和触发器函数

mysql - 关于使用数据库进行 Junit 测试

mysql - 连接两个表 SQL

sql - oracle DB 为什么具有空格比较的字符串总是给出 false?

XML 模式查询 - maxOccurs?