53

Oracleスキーマ内のすべてのテーブル、ビュー、インデックス、パッケージ、プロシージャ、関数、トリガー、タイプ、シーケンス、シノニム、付与などのDDLを生成する方法を誰か教えてもらえますか? 理想的には、行もコピーしたいのですが、それはそれほど重要ではありません。

毎回手動ではなく、何らかのスケジュールされたジョブでこれを実行したいので、SQL Developerでウィザードを使用することはできません。

理想的には、相互に許可と同義語を持ついくつかのスキーマでこれを実行するため、出力で検索/置換を実行して、スキーマ名が新しいスキーマの名前と一致するようにしたいと考えています。することが。

ありがとう!

4

7 に答える 7

66

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 (スケジューラー) 経由で実行します。高度な機能を使用している場合、オブジェクトのエクスポートは難しい場合があります。上記のコードにさらに例外を追加する必要がある場合でも驚かないでください。

于 2012-06-04T18:52:59.850 に答える
16

オブジェクトごとに個別に ddl を生成する場合は、

クエリは次のとおりです。

-- すべてのユーザー オブジェクトに対して DDL を生成

--1. すべてのテーブルに

SELECT DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME) FROM USER_TABLES;

--2. すべてのインデックスについて

SELECT DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME) FROM USER_INDEXES WHERE INDEX_TYPE ='NORMAL';

--3. すべてのビューに

SELECT DBMS_METADATA.GET_DDL('VIEW', VIEW_NAME) FROM USER_VIEWS;

また

SELECT TEXT FROM USER_VIEWS

--4. すべての実体化されたビューについて

SELECT QUERY FROM USER_MVIEWS

--5. すべての機能について

SELECT DBMS_METADATA.GET_DDL('FUNCTION', OBJECT_NAME) FROM USER_PROCEDURES WHERE OBJECT_TYPE = 'FUNCTION'

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

GET_DDL関数は、LOB、MATERIALIZED VIEW、TABLE PARTITION などの一部の object_type をサポートしていません

SO、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;
于 2014-12-05T10:41:09.413 に答える
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;

取得するオブジェクトの種類によっては、他の変更が必要になる場合がありますが...

于 2013-11-12T14:48:51.870 に答える
5

最初にスキーマ メタデータをエクスポートします。

expdp dumpfile=filename logfile=logname directory=dir_name schemas=schema_name

次に、sqlfileオプションを使用してインポートします(データをインポートせず、スキーマ DDL をそのファイルに書き込むだけです)

impdp dumpfile=filename logfile=logname directory=dir_name sqlfile=ddl.sql
于 2014-09-29T05:07:01.860 に答える
2

SCHEMA全体、つまりUSERの DDL スクリプトを生成するには、dbms_metadata.get_ddlを使用できます。

Tim Hallによって作成されたSQL*Plusで次のスクリプトを実行します。

プロンプトが表示されたら、ユーザー名を入力します。

set long 20000 longchunksize 20000 pagesize 0 linesize 1000 feedback off verify off trimspool on
column ddl format a1000

begin
   dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'SQLTERMINATOR', true);
   dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'PRETTY', true);
end;
/

variable v_username VARCHAR2(30);

exec:v_username := upper('&1');

select dbms_metadata.get_ddl('USER', u.username) AS ddl
from   dba_users u
where  u.username = :v_username
union all
select dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA', tq.username) AS ddl
from   dba_ts_quotas tq
where  tq.username = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('ROLE_GRANT', rp.grantee) AS ddl
from   dba_role_privs rp
where  rp.grantee = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', sp.grantee) AS ddl
from   dba_sys_privs sp
where  sp.grantee = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('OBJECT_GRANT', tp.grantee) AS ddl
from   dba_tab_privs tp
where  tp.grantee = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('DEFAULT_ROLE', rp.grantee) AS ddl
from   dba_role_privs rp
where  rp.grantee = :v_username
and    rp.default_role = 'YES'
and    rownum = 1
union all
select to_clob('/* Start profile creation script in case they are missing') AS ddl
from   dba_users u
where  u.username = :v_username
and    u.profile <> 'DEFAULT'
and    rownum = 1
union all
select dbms_metadata.get_ddl('PROFILE', u.profile) AS ddl
from   dba_users u
where  u.username = :v_username
and    u.profile <> 'DEFAULT'
union all
select to_clob('End profile creation script */') AS ddl
from   dba_users u
where  u.username = :v_username
and    u.profile <> 'DEFAULT'
and    rownum = 1
/

set linesize 80 pagesize 14 feedback on trimspool on verify on
于 2015-11-19T06:53:52.357 に答える