Si, es así.
Hoy me encontré con la necesidad de tener que habilitar y desabilitar los triggers de unas tablas ya que tenia que usar una sentencia ALTER para agregar algunas columnas con un default, y por supuesto cuando hacia el update del default, saltaba el trigger que controlaba los updates sobre dicha tabla y fallaba todo. Y encima, eran varios.
En fin, los "ingredientes" que usé fueron los siguientes:
La funcion sys_context.
bulk collect.
execute immediate.
Sobra la primera no voy a ahondar mucho, pero nos devuelve el esquema al que estamos conectamos.
El bulk collect nos permite leer varios registros en una tabla de pl con un único acceso a tarves de dicha instrucción. (eso nos cuenta devjoker)
El execute immediate ejecuta una sentencia sql dinamica.
El bloque pl mas o menos es así:
declare
type triggers_rt is record(trigger_name all_triggers.trigger_name%type);
type triggers_tt is table of triggers_rt index by pls_integer;
v_enabled_triggers triggers_tt;
v_owner varchar2(30) := sys_context('USERENV', 'CURRENT_SCHEMA');
v_sql varchar2(2048);
begin
select trigger_name
bulk collect into v_enabled_triggers
from all_triggers
where owner = v_owner
and table_name = 'COL_SUBTIPOS_GARANTIAS_MOVI'
and status = 'ENABLED';
if v_enabled_triggers.first is not null then
for i in v_enabled_triggers.first .. v_enabled_triggers.last loop
begin
v_sql := 'ALTER TRIGGER' ||v_enabled_triggers(i).trigger_name||' DISABLE';
DBMS_OUTPUT.PUT_LINE('ALTER_TABLE: Disabling trigger '||v_enabled_triggers(i).trigger_name);
execute immediate v_sql;
exception
when OTHERS then
DBMS_OUTPUT.PUT_LINE('ALTER_TABLE: Error while running: '||v_sql);
end;
end loop;
end if;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR: '||SQLERRM);
END;
/
En definitiva eso desactivará los triggers de esa tabla sin tener que explicitar toda la sentencia alter para cada trigger de la tabla.
En definitiva, espero que les sea útil.
Marianittens.
No hay comentarios:
Publicar un comentario