Para activar o desactivar todas las constraints de las tablas de un esquema he creado dos procedimientos.
El procedimiento dis_all_cons se encargará de desactivar todas las constraints de las tablas de un usuario determinado, por defecto el usuario que invoca el procedimiento.
El usuario que ejecuta el procedimiento debe de ser capaz de tener acceso a las tablas del esquema en cuestión y poder realizar un ALTER sobre ellas.
El procedimiento intentará desactivar las constraints en cascada, así que si existen tablas en otro esquema que hacen referencia (foreign key) a una del esquema del que queremos desactivarlas (primary key) también las desactivará, y si no tenemos permisos fallará. El procedimiento que las activa ena_all_cons no tiene en cuenta a estas constraints que se encuentran en otros esquemas. Espero hacerlo en algún momento, ya que no sé cómo hacer una activación en cascada fácilmente.
Podemos consultar previamente la información de las constraints de las tablas del esquema que queremos modificar y ver su estado entre otras cosas.
Ejemplo utilizando el esquema SCOTT
select table_name,constraint_name,constraint_type,status,r_constraint_name
from all_constraints
where owner='SCOTT';
create or replace procedure dis_all_cons
( p_owner
varchar2 default USER
)
--Uso: dis_all_cons[('esquema')];
--dis_all_cons; --desactiva las constraints del esquema de quien ejecuta
--dis_all_cons('HR'); --desactiva las constraints del esquema HR
--el procedimiento se ejecutará con los permisos de quien lo invoca
authid current_user
as
begin
--obtenemos nombre de la tabla y nombre de la restricción
--pertenecientes al usuario especificado
--que no estan desactivadas
--primary key que no sean de tablas organizadas por indice
--o cualquier otra constraint q sea del tipo C ó U ó R
for reg
in (
select table_name,constraint_name
from all_constraints
where owner=p_owner
and status<>'DISABLED'
and ( (constraint_type
in ('P')
and table_name
not in
(
select table_name
from all_tables
where owner=p_owner
and iot_type
is not null
)
)
or constraint_type
in ('C','U','R')
)
)
loop
execute immediate 'alter table '||p_owner||'.'||reg.table_name||' DISABLE constraint '||reg.constraint_name||' cascade';
end loop;
end dis_all_cons;
/
------------------------------------------------------------------------------------------
create or replace procedure ena_all_cons
(
p_owner
varchar2 default USER
)
--Uso: ena_all_cons[('esquema')];
--ena_all_cons; --activa las constraints del esquema de quien ejecuta
--ena_all_cons('HR'); --activa las constraints del esquema HR
authid current_user
as
begin
--obtenemos nombre de la tabla y nombre de la restricción
--pertenecientes al usuario especificado
--que no estan activadas
--primary key que no sean de tablas organizadas por indice
--primero se activan todas las primary key
for reg
in (
select table_name,constraint_name
from all_constraints
where owner=p_owner
and status<>'ENABLED'
and constraint_type
in ('P')
and table_name
not in
(
select table_name
from all_tables
where iot_type
is not null
)
)
loop
execute immediate 'alter table '||p_owner||'.'||reg.table_name||' ENABLE constraint '||reg.constraint_name;
end loop;
--se activan el resto de constraints
--de tipo C,U y R
for reg
in (
select table_name,constraint_name
from all_constraints
where owner=p_owner
and status<>'ENABLED'
and constraint_type
in ('C','U','R')
)
loop
execute immediate 'alter table '||p_owner||'.'||reg.table_name||' ENABLE constraint '||reg.constraint_name;
end loop;
end ena_all_cons;
/
El uso de estos procedimientos queda bajo responsabilidad de quien los utilice.