tablas tabla primary primaria get_ddl foranea exportar expdp esquema ejemplos developer dbms_metadata crear con clave 12c oracle schema ddl

tabla - export table oracle



¿Cómo generar un DDL completo de un esquema de Oracle(scriptable)? (6)

¿Alguien puede decirme cómo puedo generar el DDL para todas las tablas, vistas, índices, paquetes, procedimientos, funciones, desencadenantes, tipos, secuencias, sinónimos, subvenciones, etc. dentro de un esquema de Oracle? Idealmente, me gustaría copiar las filas también, pero eso es menos importante.

Quiero hacer esto en un trabajo programado de algún tipo y no manualmente cada vez, por lo que descarta utilizar el asistente en SQL Developer.

Idealmente, dado que ejecutaré esto en varios esquemas que tengan concesiones y sinónimos entre sí, me gustaría tener una forma de hacer un hallazgo / reemplazo en el resultado para que los nombres de los esquemas coincidan con los nombres de mis nuevos esquemas. ser.

¡Gracias!


El procedimiento get_ddl para un PAQUETE devolverá la especificación Y el cuerpo, por lo que será mejor cambiar la consulta en todos los objetos para que los cuerpos del paquete no se devuelvan en la selección.

Hasta ahora he cambiado la consulta a esto:

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;

Aunque es posible que se necesiten otros cambios según los tipos de objeto que obtenga ...


Hay un problema con objetos como 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'');


Para generar el script DDL para todo un SCHEMA, es decir, un USUARIO , puede usar dbms_metadata.get_ddl .

Ejecute la siguiente secuencia de comandos en SQL * Plus creado por Tim Hall :

Proporcione el nombre de usuario cuando se le solicite.

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


Puede distribuir el esquema en un archivo mediante SQL * Plus y el paquete dbms_metadata. Luego reemplace el nombre del esquema con otro a través de sed. Esto funciona para Oracle 10 y superior.

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

Pon todo en un script y ejecútalo a través de cron (scheduler). Exportar objetos puede ser complicado cuando se utilizan funciones avanzadas. No se sorprenda si necesita agregar algunas excepciones más al código anterior.


Si desea generar ddl individualmente para cada objeto,

Las consultas son:

--GENERATE DDL PARA TODOS LOS OBJETOS DE USUARIO

--1. PARA TODAS LAS TABLAS

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

--2. PARA TODOS LOS ÍNDICES

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

--3. PARA TODAS LAS VISTAS

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

O

SELECT TEXT FROM USER_VIEWS

--4. PARA TODAS LAS VISTAS MATERIALIZADAS

SELECT QUERY FROM USER_MVIEWS

--5. PARA TODA LA FUNCIÓN

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

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

La función GET_DDL no es compatible con algún tipo de objeto como LOB, MATERIALIZED VIEW, TABLE PARTITION

ASÍ, la consulta consolidada para generar DDL será:

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;


primero exporte los metadatos del esquema y luego impórtelos usando la opción sqlfile (no importará datos, solo escribirá ddl del esquema en ese archivo)

ejemplo: - 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