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

Eri*_*ric 45 oracle schema ddl

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

我希望在某种类型的预定作业上执行此操作,而不是每次都手动执行此操作,以便在SQL Developer中使用向导进行排除.

理想情况下,因为我将在几个具有相互授予和同义词的模式上运行它,我想有一种方法在输出中进行查找/替换,因此模式名称匹配我的新模式的名称成为.

谢谢!

小智 54

您可以通过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
Run Code Online (Sandbox Code Playgroud)

将所有内容放在脚本中并通过cron(scheduler)运行.使用高级功能时,导出对象可能会非常棘手.如果您需要为上述代码添加更多例外,请不要感到惊讶.

  • 我想将数据库从一台服务器复制到另一台服务器,所以这有帮助,但我需要按顺序排列数据库对象 - 手动这是不可能的,因为我有 1600 个数据库对象 - 有没有办法让我们得到按顺序排列的所有数据库对象脚本 - 其中它们是为一个特定用户/模式创建的 (2认同)

Gur*_*tia 9

如果要为每个对象单独生成ddl,

查询是:

- 为所有用户对象创建DDL

--1.适用于所有表格

SELECT DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME) FROM USER_TABLES;
Run Code Online (Sandbox Code Playgroud)

--2.适用于所有指标

SELECT DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME) FROM USER_INDEXES WHERE INDEX_TYPE ='NORMAL';
Run Code Online (Sandbox Code Playgroud)

--3.适合所有人

SELECT DBMS_METADATA.GET_DDL('VIEW', VIEW_NAME) FROM USER_VIEWS;
Run Code Online (Sandbox Code Playgroud)

要么

SELECT TEXT FROM USER_VIEWS
Run Code Online (Sandbox Code Playgroud)

--4.适用于所有物质化的视图

SELECT QUERY FROM USER_MVIEWS
Run Code Online (Sandbox Code Playgroud)

--5.适用于所有功能

SELECT DBMS_METADATA.GET_DDL('FUNCTION', OBJECT_NAME) FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'FUNCTION'
Run Code Online (Sandbox Code Playgroud)

================================================== =============================================

GET_DDL函数不支持某些object_type,如LOB,MATERIALIZED VIEW,TABLE PARTITION

因此,生成DDL的合并查询将是:

SELECT OBJECT_TYPE, OBJECT_NAME,DBMS_METADATA.GET_DDL(OBJECT_TYPE, OBJECT_NAME, OWNER)
  FROM ALL_OBJECTS 
  WHERE (OWNER = 'XYZ') AND OBJECT_TYPE NOT IN('LOB','MATERIALIZED VIEW', 'TABLE PARTITION') ORDER BY OBJECT_TYPE, OBJECT_NAME;
Run Code Online (Sandbox Code Playgroud)


小智 6

首先导出模式元数据:

expdp dumpfile=filename logfile=logname directory=dir_name schemas=schema_name
Run Code Online (Sandbox Code Playgroud)

然后使用sqlfile选项导入(它不会导入数据,只会将架构 DDL 写入该文件)

impdp dumpfile=filename logfile=logname directory=dir_name sqlfile=ddl.sql
Run Code Online (Sandbox Code Playgroud)


v0d*_*vil 5

PACKAGE_BODY等对象存在问题:

\n\n
SELECT DBMS_METADATA.get_ddl(object_Type, object_name, owner) FROM ALL_OBJECTS WHERE OWNER = \'WEBSERVICE\';\n\n\nORA-31600 invalid input value PACKAGE BODY parameter OBJECT_TYPE in function GET_DDL\nORA-06512: \xd0\xbd\xd0\xb0  "SYS.DBMS_METADATA", line 4018\nORA-06512: \xd0\xbd\xd0\xb0  "SYS.DBMS_METADATA", line 5843\nORA-06512: \xd0\xbd\xd0\xb0  line 1\n31600. 00000 -  "invalid input value %s for parameter %s in function %s"\n*Cause:    A NULL or invalid value was supplied for the parameter.\n*Action:   Correct the input value and try the call again.\n\n\n\nSELECT DBMS_METADATA.GET_DDL(REPLACE(object_type,\' \',\'_\'), object_name, owner)\n  FROM all_OBJECTS \n  WHERE (OWNER = \'OWNER1\');\n
Run Code Online (Sandbox Code Playgroud)\n


Vit*_*nto 5

用于PACKAGE的get_ddl过程将同时返回规范和正文,因此最好更改all_objects上的查询,以便在选择时不返回程序包主体。

到目前为止,我将查询更改为:

SELECT DBMS_METADATA.GET_DDL(REPLACE(object_type, ' ', '_'), object_name, owner)
FROM all_OBJECTS
WHERE (OWNER = 'OWNER1')
and object_type not like '%PARTITION'
and object_type not like '%BODY'
order by object_type, object_name;
Run Code Online (Sandbox Code Playgroud)

尽管根据您获得的对象类型可能需要进行其他更改...