2012-06-04 17 views
40

Czy ktoś może mi powiedzieć, w jaki sposób mogę wygenerować DDL dla wszystkich tabel, widoków, indeksów, pakietów, procedur, funkcji, wyzwalaczy, typów, sekwencji, synonimów, grantów itp. Wewnątrz schematu Oracle? Idealnie, ja też chciałbym skopiować wiersze, ale to jest mniej ważne.Jak wygenerować całe DDL schematu Oracle (skryptowalne)?

Chcę to zrobić na zaplanowanym rodzaju pracy, a nie ręcznie za każdym razem, więc wyklucza się przy użyciu kreatora w SQL Developer.

Idealnie, ponieważ będę uruchamiał to na kilku schematach, które mają wzajemne granty i synonimy, chciałbym mieć sposób na znalezienie/zastąpienie w wynikach, aby nazwy schematów pasowały do ​​nazw moich nazw. nowe schematy będą.

Dzięki!

+0

Programista SQL może to zrobić za pomocą interfejsu wiersza poleceń, więc jest to możliwe, jeśli chcesz iść tą trasą. – thatjeffsmith

+0

Prosty przebieg: SELECT DBMS_METADATA.get_ddl (object_Type, object_name, owner) OD ALL_OBJECTS WHERE OWNER = 'OWNER_NAME'; –

Odpowiedz

48

Możesz przesłać schemat do pliku za pomocą pakietów SQL * Plus i dbms_metadata. Następnie zastąp nazwę schematu inną za pomocą sed. Działa to dla Oracle 10 i wyższych.

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 

Umieść wszystko w skrypcie i uruchom za pomocą crona (scheduler). Eksportowanie obiektów może być trudne, gdy używane są zaawansowane funkcje. Nie zdziw się, jeśli chcesz dodać kilka wyjątków do powyższego kodu.

+1

Co z dotacjami? – eisberg

+0

Wszystko jest opakowane w coś podobnego do 80 znaków, mimo że mam linie ustawione na 32767. Jakikolwiek sposób to naprawić? – Superdooperhero

4

Jest problem z przedmiotami takimi jak 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

Wygląda na to, że coś się dzieje, ale może pomóc rozwinąć "kłopot" w PACKAGE_BODY i umieścić kod SQL w czystym małym bloku kodu. –

+0

Musisz zastąpić spacje dla podkreśleń. Spróbuj uruchomić: "SELECT DBMS_METADATA.get_ddl (replace (object_Type, '', '_'), object_name, owner) Z ALL_OBJECTS WHERE OWNER = 'WEBSERVICE';" – wind39

+0

mój post był dokładnie o tym – v0devil

4

Procedura get_ddl za pakiet powróci zarówno specyfikację i ciała, tak będzie lepiej zmienić zapytanie na all_objects tak organów pakietowych nie są zwracane przy wyborze.

Tak dalece zmienił zapytanie do tego:

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; 

Chociaż mogą być potrzebne inne zmiany w zależności od typów obiektów są coraz ...

2

najpierw wyeksportować metadane schematu, a następnie zaimportować przez używając opcji sqlfile (nie będzie importować dane tylko będzie to napisać ddl schematu do tego pliku)

przykład: - 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

Jeśli chcesz wygenerować DDL indywidualnie dla każdego obiektu,

Zapytania są:

--generate DDL FOR ALL Obiekty użytkownika

- 1. Dla wszystkich tabel

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

--2.DLA wszystkie indeksy

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

--3. Dla wszystkich widoków

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

LUB

SELECT TEXT FROM USER_VIEWS 

--4. FOR ALL MATERILIZED WIDOKI

SELECT QUERY FROM USER_MVIEWS 

--5. DLA WSZYSTKICH FUNKCJI

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

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

GET_DDL Funkcja wsparcie nie robi jakiegoś typ_obiektu jak LOB, widok zmaterializowany, tablica partycji

SO, zapytanie Skonsolidowane do generowania DDL będą:

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

wybierz dbms_metadata.get_ddl ("MATERIALIZED_VIEW", "MVIEW_NAME") z dual; Prace –

1

Aby wygenerować skrypt DDL dla całego zestawu SCHEMA, tj. USER, można użyć dbms_metadata.get_ddl.

Uruchom następujący skrypt w SQL * Plus stworzonej przez Tim Hall:

dostarczyć użytkownika monit.

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