2012-06-04 10 views
40

Qualcuno può dirmi come posso generare il DDL per tutte le tabelle, viste, indici, pacchetti, procedure, funzioni, trigger, tipi, sequenze, sinonimi, concessioni, ecc. All'interno di uno schema Oracle? Idealmente, vorrei copiare anche le righe, ma è meno importante.Come generare l'intero DDL di uno schema Oracle (con script)?

Desidero eseguire questa operazione in un determinato ordine e non manualmente ogni volta, in modo da escludere l'utilizzo della procedura guidata in SQL Developer.

Idealmente, dal momento che eseguirò questo su più schemi che hanno concessioni e sinonimi l'uno con l'altro, mi piacerebbe avere un modo per fare un find/replace nell'output in modo che i nomi degli schemi corrispondano a tutti i nomi dei miei nuovi schemi saranno.

Grazie!

+0

SQL Developer può farlo tramite la sua interfaccia della riga di comando, quindi è possibile se si vuole andare quella rotta. – thatjeffsmith

+0

Esecuzione semplice: SELECT DBMS_METADATA.get_ddl (object_Type, object_name, owner) FROM ALL_OBJECTS WHERE OWNER = 'OWNER_NAME'; –

risposta

48

È possibile eseguire lo spooling dello schema in un file tramite SQL * Plus e pacchetto dbms_metadata. Quindi sostituire il nome dello schema con un altro tramite sed. Funziona per Oracle 10 e versioni successive.

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', 
      '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', 
      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 

Mettere tutto in uno script ed eseguirlo tramite cron (scheduler). L'esportazione di oggetti può essere complicata quando vengono utilizzate funzionalità avanzate. Non essere sorpreso se è necessario aggiungere altre eccezioni al codice precedente.

+1

E i sussidi? – eisberg

+0

Tutto viene incapsulato in qualcosa come 80 caratteri, anche se ho la linearizzazione impostata su 32767. Qualche modo per sistemarlo? – Superdooperhero

4

C'è un problema con oggetti come PACKAGE_BODY:

SELECT DBMS_METADATA.get_ddl(object_Type, object_name, owner) FROM ALL_OBJECTS WHERE OWNER = 'WEBSERVICE'; 


ORA-31600 invalid input value PACKAGE BODY parameter OBJECT_TYPE in function GET_DDL 
ORA-06512: на "SYS.DBMS_METADATA", line 4018 
ORA-06512: на "SYS.DBMS_METADATA", line 5843 
ORA-06512: на line 1 
31600. 00000 - "invalid input value %s for parameter %s in function %s" 
*Cause: A NULL or invalid value was supplied for the parameter. 
*Action: Correct the input value and try the call again. 



SELECT DBMS_METADATA.GET_DDL(REPLACE(object_type,' ','_'), object_name, owner) 
    FROM all_OBJECTS 
    WHERE (OWNER = 'OWNER1'); 
+0

Sembra che tu stia partecipando a qualcosa, ma potrebbe essere utile espandere il "problema" con PACKAGE_BODY e inserire il codice SQL in un piccolo blocco di codice ordinato. –

+0

È necessario sostituire gli spazi per le sottolineature. Prova a eseguire: "SELECT DBMS_METADATA.get_ddl (replace (object_Type, '', '_'), object_name, owner) FROM ALL_OBJECTS WHERE OWNER = 'WEBSERVICE';" – wind39

+0

il mio post era esattamente su di esso – v0devil

4

La procedura get_ddl per un pacchetto restituirà sia specifiche e corpo, quindi sarà meglio cambiare interrogare delle all_objects così i corpi pacchetto non vengono restituiti sulla selezione.

Finora ho cambiato la query per questo:

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; 

Anche se potrebbero essere necessari altri cambiamenti a seconda dei tipi di oggetto che si stanno ottenendo ...

2

prima esportazione dei metadati schema e quindi importare da utilizzando l'opzione script sqlfile (non sarà importare dati solo che scriverà ddl di schema per quel file)

esempio: - expdp dumpfile=filename logfile=logname directory=dir name schemas=schema name

username:/ as sysdba

impdp dumpfile=filename logfile=logname directory=dir sqlfile=sql.log

username:/ as sysdba

3

Se si desidera generare individualmente DDL per ogni oggetto,

query sono:

--generate DDL per tutti gli utenti OGGETTI

--1. PER TUTTI I TAVOLI

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

--2.PER TUTTI GLI INDICI

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

--3. Per tutte le viste

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

O

SELECT TEXT FROM USER_VIEWS 

--4. PER TUTTI MATERILIZED VISTE

SELECT QUERY FROM USER_MVIEWS 

--5. PER TUTTE LE FUNZIONI

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

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

GET_DDL funzione di supporto doesnt per qualche object_type come LOB, vista materializzata, tabella delle partizioni

SO, interrogare consolidato per la generazione di DDL sarà:

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; 
+1

selezionare dbms_metadata.get_ddl ('MATERIALIZED_VIEW', 'MVIEW_NAME') da doppio; lavori –

1

per generare lo script DDL per un intero SCHEMA vale a dire una UTENTE, è possibile utilizzare dbms_metadata.get_ddl.

Eseguire il seguente script in SQL * Plus creato da Tim Hall:

Fornire il nome utente quando richiesto.

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 
Problemi correlati