it-swarm.com.de

Schreiben Sie Oracle DDL automatisiert aus

Oracle SQL Developer kann DDL über Tools -> Database Export... Exportieren. Dies funktioniert sehr gut, erfordert jedoch manuelle Eingriffe.

Ich kenne DBMS_METADATA.get_ddl(), habe aber festgestellt, dass der Export nicht perfekt ist. Ich bin auf Probleme gestoßen, bei denen die exportierte DBMS_METADATA DDL nicht verwendet werden konnte, ohne zuvor Probleme wie Unterbrechungen in der Mitte eines Keywords zu beheben, und noch schlimmer. Wenn jedoch jemand eine Möglichkeit zum Exportieren von DDL über DMBS_METADATA Kennt, die ohne manuelle Korrekturen ausgeführt werden kann, wäre dies ebenfalls eine großartige Lösung.

Grundsätzlich suche ich nach einer automatischen/skriptfähigen Möglichkeit, DDL zu exportieren identisch zu dem, was manuell exportiert wird.

Wie kann ich das machen?

14
MatthewToday

Wenn sqlplus Ihre Ausgabe von dbms_metadata.get_ddl verschraubt, wählen Sie die Ausgabe in einem CLOB aus und schreiben Sie das CLOB in das Dateisystem.

z.B.

DECLARE
    data CLOB;
    objType varchar2(30) := 'TABLE';
    objSchema varchar2(30) := 'SCOTT';
    objName varchar2(30) := 'EMP';
    fname varchar2(256) := objType || '_' || objSchema || '_' || objName || '.sql';
BEGIN
    SELECT dbms_metadata.get_ddl(objType,objName,objSchema) into data from dual;
    DBMS_XSLPROCESSOR.CLOB2FILE(data,'DATA_PUMP_DIR',fname);
END;
/

Dadurch sollten Sie die richtige DDL erhalten, ohne dass die Ausgabe durcheinander gerät. Das einzige ist, dass das Skript auf dem DB-Server und nicht auf dem Client erstellt wird, von dem aus Sie sqlplus aufrufen.

Das Skript wird in dem Verzeichnis gespeichert, auf das der Eintrag 'DATA_PUPM_DIR' auf dem DB Server verweist. d.h.

select directory_path from all_directories where directory_name like 'DATA_PUMP_DIR';

Darüber hinaus können Sie eine Art Iteration über alle Tabellen/Indizes usw. eines Schemas hinzufügen und in kürzester Zeit die DDL eines vollständigen Schemas abrufen. Das mache ich die ganze Zeit.

5
user5294

Der Grund, warum Sie Probleme mit dbms_metadata.get_ddl Haben, ist, dass CLOBs ausgegeben werden, die bis zu 4 GB groß sein können. Standardmäßig kürzen SQL * Plus und Oracle SQL Developer Langtext, damit der Client nicht mit großen Textmengen belegt wird.

Es ist sehr einfach, dieses Verhalten in SQL * Plus mit ein paar SET - Befehlen zu überschreiben und eine saubere DDL zu erhalten.

Das Skript, das Sie benötigen, ist:

-- Run this script in SQL*Plus.

-- don't print headers or other crap
set heading off;
set echo off;
set pagesize 0;      

-- don't truncate the line output
-- trim the extra space from linesize when spooling
set long 99999;      
set linesize 32767;  
set trimspool on;    

-- don't truncate this specific column's output
col object_ddl format A32000;

spool sys_ddl.sql;

SELECT dbms_metadata.get_ddl(object_type, object_name, owner) || ';' AS object_ddl
FROM DBA_OBJECTS
WHERE 
      OWNER = 'SYS'
  AND OBJECT_TYPE IN (
      'TABLE'
    , 'INDEX'
    , 'SEQUENCE'
    , 'VIEW'
  )
ORDER BY
    OWNER
  , OBJECT_TYPE
  , OBJECT_NAME
;

spool off;
6
Nick Chammas

Die folgenden Transformationen können hilfreich sein. Ich habe die Methode DBMS_XSLPROCESSOR.CLOB2FILE nicht verwendet, aber ich habe diese verwendet, um eine Oracle-Datenbank von Solaris nach Linux zu migrieren. Ich konnte Data Pump nicht verwenden, da sie eine Oracle-Version verwendeten und XML-Datentypen für Spaltendatentypen verwendeten.

DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'PRETTY',             TRUE );
DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'SQLTERMINATOR',      TRUE );
DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS',    FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'OID',                FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM, 'TABLESPACE',         TRUE );
0
Gandolf989