2010-09-13 9 views
9

Estoy realizando una migración masiva de una gran base de datos Oracle. El primer paso de esto implica renombrar una carga completa de tablas como preparación para eliminarlas más tarde (pero necesito guardar los datos en ellas por ahora). Cualquier restricción de clave externa en ellos debe descartarse: no deben conectarse al resto de la base de datos. Si los abandonara ahora podría CASCADE RESTRICCIONES, pero cambiar de nombre simplemente altera las restricciones.Oracle - elimine las restricciones de la tabla sin descartar las tablas

¿Hay alguna forma en que pueda eliminar todas las restricciones que CASCADE CONSTRAINTS caería sin soltar la tabla?

Respuesta

18

Puede hacerlo con SQL dinámico y el diccionario de datos:

begin 
    for r in (select table_name, constraint_name 
       from user_constraints 
       where constraint_type = 'R') 
    loop 
     execute immediate 'alter table '||r.table_name 
          ||' drop constraint '||r.constraint_name; 
    end loop; 
end loop; 

Si las tablas son propiedad de más de un usuario que necesita para conducir desde DBA_CONSTRAINTS e incluyen un e-mail en la proyección y los ejecutados declaración. Si quiere tocar menos que todas las tablas, me temo que tendrá que especificar la lista en la cláusula WHERE, a menos que haya algún patrón en sus nombres.

+0

Eso se ve bien. He agregado un par de restricciones para reflejar qué tablas quiero modificar y me he ido con esto. ¡Gracias! – Submonoid

0

Puede desactivar/volver a habilitar las restricciones sin soltarlas. Eche un vistazo al this article.

+0

Cierto, pero eso realmente no me ayuda. Podría ir/soltar las restricciones individuales, pero es una gran base de datos y no quiero encontrar todas las restricciones que hacen referencia a las tablas que estoy moviendo. Quiero poder eliminar automáticamente todas las restricciones de la misma manera que si utilizara 'DROP TABLE foo CASCADE CONSTRAINTS'. – Submonoid

Cuestiones relacionadas