¿Cómo puedo deshabilitar todas las restricciones de tabla en Oracle con un solo comando? Esto puede ser para una sola tabla, una lista de tablas o para todas las tablas.
95
Es mejor evitar escribir archivos de cola temporales. Utilice un bloque PL / SQL. Puede ejecutar esto desde SQL * Plus o ponerlo en un paquete o procedimiento. La unión a USER_TABLES está ahí para evitar restricciones de vista.
Es poco probable que realmente desee deshabilitar todas las restricciones (incluidas NOT NULL, claves primarias, etc.). Debería pensar en poner constraint_type en la cláusula WHERE.
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND c.status = 'ENABLED'
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
ORDER BY c.constraint_type DESC)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
END LOOP;
END;
/
Habilitar las restricciones de nuevo es un poco complicado: debe habilitar las restricciones de clave primaria antes de poder hacer referencia a ellas en una restricción de clave externa. Esto se puede hacer usando un ORDER BY en constraint_type. 'P' = clave primaria, 'R' = clave externa.
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND c.status = 'DISABLED'
ORDER BY c.constraint_type)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
END LOOP;
END;
/
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
al primer segmento de código.Para tener en cuenta las dependencias entre las restricciones:
fuente
No es un solo comando, pero así es como lo hago. El siguiente script ha sido diseñado para ejecutarse en SQL * Plus. Tenga en cuenta que he escrito esto a propósito para que solo funcione dentro del esquema actual.
Para restringir lo que suelta, agregue un filtro donde la cláusula a la declaración de selección: -
Para ejecutar en más del esquema actual, modifique la instrucción select para seleccionar de all_constraints en lugar de user_constraints.
Nota : por alguna razón, no puedo hacer que el guión bajo NO actúe como una cursiva en el párrafo anterior. Si alguien sabe cómo solucionarlo, no dude en editar esta respuesta.
fuente
Utilice el cursor siguiente para deshabilitar todas las restricciones ... Y modifique la consulta para habilitar las restricciones ...
fuente
Esto se puede escribir en PL / SQL de manera bastante simple basándose en la vista del sistema DBA / ALL / USER_CONSTRAINTS, pero varios detalles no lo hacen tan trivial como suena. Hay que tener cuidado con el orden en que se realiza y también hay que tener en cuenta la presencia de índices únicos.
El orden es importante porque no puede eliminar una clave única o primaria a la que hace referencia una clave externa, y podría haber claves externas en tablas en otros esquemas que hagan referencia a claves primarias en el suyo, por lo que a menos que tenga el privilegio ALTER ANY TABLE, entonces no se pueden eliminar esos PK y UK. Además, no puede cambiar un índice único para que sea un índice no único, por lo que debe eliminarlo para eliminar la restricción (por esta razón, casi siempre es mejor implementar restricciones únicas como una restricción "real" que es compatible con una restricción no -índice único).
fuente
No parece que pueda hacer esto con un solo comando, pero esto es lo más parecido que pude encontrar.
fuente
Esta es otra forma de deshabilitar las restricciones (provino de https://asktom.oracle.com/pls/asktom/f?p=100:11:2402577774283132::::P11_QUESTION_ID:399218963817 )
Funciona de maravilla
fuente
En el script "deshabilitar", el orden por cláusula debe ser el siguiente:
El objetivo de esta cláusula es deshabilitar las restricciones en el orden correcto.
fuente
Esta declaración devuelve los comandos que desactivan todas las restricciones, incluida la clave principal, las claves externas y otras restricciones.
fuente
con cursor para bucle (usuario = 'TRANEE', tabla = 'D')
(Si cambia deshabilitar a habilitar, puede habilitar todas las restricciones)
fuente
Puede ejecutar todos los comandos devueltos por la siguiente consulta:
seleccione 'ALTER TABLE' || substr (c.table_name, 1,35) || 'DESACTIVAR RESTRICCIÓN' || nombre_restricción || ' ; ' from user_constraints c --donde c.table_name = 'TABLE_NAME';
fuente