Saltar al contenido

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

Si hallas algún problema con tu código o trabajo, recuerda probar siempre en un entorno de testing antes aplicar el código al proyecto final.

Solución:

Puede enviar el esquema a 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<schema.out.change.sql

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

Si desea generar ddl individualmente para cada objeto,

Las consultas son:

–GENERAR DDL PARA TODOS LOS OBJETOS DE USUARIO

–1. PARA TODAS LAS MESAS

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 MATERILIZADAS

SELECT QUERY FROM USER_MVIEWS

–5. PARA TODAS LAS FUNCIONES

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

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

GET_DDL La función no es compatible con algún tipo de objeto como LOB, VISTA MATERIALIZADA, PARTICIÓN DE MESA

SO, 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;

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

Hasta ahora cambié 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 objetos que obtenga…

Tienes la opción de asistir nuestra tarea ejecutando un comentario y dejando una valoración te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *