Con este espacio pretendo crear un rincón de información relacionda con las bases de datos Oracle, sus funcionalidades, características, noticias.... etc. Interaré hacer pequeños artículos con ejemplos demostrativos para que resulte más fácil leerlos. No dudéis en mandar vuestros comentarios, críticas, aclaraciones... etc.

Información del Autor

Llevo más de diez años trabajando como DBA Oracle en diferentes compañías y desde el 2004 lo hago de forma freelance a través de una sociedad creada por mí, Infor Consult Soluciones (http://www.inforconsult.es). Si tienes cualquier duda, comentario o propuesta que hacerme, no lo dudes.

lunes, 9 de marzo de 2009

Habilitar y deshabiltar las constraints automáticamente

Muchas veces nos encontramos con la necesidad de tener que borrar el contenido de ciertas tablas o simplemente de todo nuestro esquema y debido a las restricciones/constraints de integridad referencial, más conocidad por Foreign Key -FK-, la tarea se vuelve pesada o sencillamente inabordable. En estos casos hay que tener muy claro el esquema de restricciones para ir borrando primero las tablas sin dependencias (las tablas hijas) e ir llegando a las tablas maestras.

Si no tenemos este esquema claro, no tenemos tiempo... etc. Podemos manejar esta situación deshabilitando todas las FK, lo que nos permitirá borrar el contenido de las tablas en el orden que queramos, y volviéndolas a habilitar. Una vez más, tener que teclear una por una las sentencias que deshabilitan cada FK es una tarea pesada y lenta. Para este propósitito podemos usar SQL, haciéndo que él mismo nos dé todas las instrucciones. De esta forma, nosotros tecleamos una sentencia que como resultado nos da "n" sentencias. Éstas las capturamos en un spool y lo lanzamos. Todo esto lo tengo automatizado en el siguiente script.

--------- INICIO DEL SCRIPT -------
set echo off

-- Al comienzo nos pide el usuario que posee las restriciones. Si somos nosotros mismos no tenemos que teclear nada.
ACCEPT usuario CHAR DEFAULT 'user' PROMPT 'Usuario (Enter para ninguno): '

-- Ahora nos pide si queremos habilitar o deshabilitar las constraints.
ACCEPT objeto CHAR DEFAULT 'ENABLE' PROMPT 'Si desea **deshabilitar** las restricciones escriba: DISABLE. ENTER para **habilitar**: '

-- Guardamos la sentencia en el buffer SQL
select 'ALTER TABLE ' ||
nvl('&usuario.', user ) ||'.'|| table_name ||
' &objeto. constraint ' || constraint_name || ';'
from dba_constraints
where owner = nvl(upper('&usuario.'), user )
and constraint_type = 'R'
.

-- Configuramos algunos parámetros SQLPlus.
set timing off feed off pagesize 0 verify off

-- Abrimos el spool. Esto escribirá en la carpeta temporal del sistema. Después ejecutamos la sentencia del buffer y cerramos el spool.
spool %TEMP%\constraints.sql
/
spool off

-- Ponemos los parámetros igual que estaban.
set timing on feed on pagesize 100 verify on

-- Sacamos unos mensajes aclaratorios.
prompt ******************* PRECAUCIÓN ********************
pause Se van a lanzar las sentencias que deshabilitan las Foreign Key. Si no desea seguir pulse Ctrl+C
pause ¿Seguro?. Si no desea seguir pulse Ctrl+C

-- Se abre el spool donde dejará el resultado de operar con las constraints. Se ejecutan las sentencias y se cierra el spool.
spool %TEMP%\constraints
start %TEMP%\constraints.sql
spool off

prompt ******************* INFORMACIÓN ********************
prompt Fin. Se ha dejado un fichero de log en %temp%\constraints.lst

--------- FIN DEL SCRIPT -------

Para ejecutarlo, os recomiendo que copiéis las lineas entre INICIO y FIN DEL SCRIPT, las peguéis en un fichero, por ejemplo, constraints.sql. Una vez hecho esto, tenéis que iros a SQLPlus, conectaros con el usuario que posee las restricciones o con otro que pueda administrar las restricciones de éste -normalmente un DBA-, y lanzarlo con la sentencia START ruta\constraints.sql.

Solo debéis responder a las preguntas que os hace y si queréis, él mismo lanzará todas las sentencias de enable/disable constraints dejando un log en la carpeta temporal con nombre constraints.lst.

Juan Lorenzo Arellano
Infor Consult Soluciones.
www.inforconsult.es

No hay comentarios: