¿Se puede bloquear un gatillo? ¿Cómo se determinaría que es?
En respuesta¿Perderé algún cambio si reemplazo un disparador de Oracle mientras mi aplicación se está ejecutando?, Fui a ver si el disparador estaba bloqueado por una instrucción INSERT. No fue así y no puedo encontrar nada en Internet que sugiera que se puede bloquear un disparador.
Si ejecuto lo siguiente en una sesión:
create table test_trigger (id number);
create table test_trigger_h (id number);
create or replace trigger test_trigger_t
after insert on test_trigger for each row
begin
insert into test_trigger_h (id) values (:new.id);
end;
/
insert into test_trigger
select level
from dual
connect by level <= 1000000;
y luego, en una segunda sesión, intente averiguar qué bloqueos se están produciendo, obtengo lo siguiente:
select object_name, object_type
, case l.block
when 0 then 'Not Blocking'
when 1 then 'Blocking'
when 2 then 'Global'
end as status
, case v.locked_mode
when 0 then 'None'
when 1 then 'Null'
when 2 then 'Row-S (SS)'
when 3 then 'Row-X (SX)'
when 4 then 'Share'
when 5 then 'S/Row-X (SSX)'
when 6 then 'Exclusive'
else to_char(lmode)
end as mode_held
from v$locked_object v
join dba_objects d
on v.object_id = d.object_id
join v$lock l
on v.object_id = l.id1
join v$session s
on v.session_id = s.sid
;
OBJECT_NAME OBJECT_TYPE STATUS MODE_HELD
-------------------- -------------------- --------------- ---------------
TEST_TRIGGER TABLE Not Blocking Row-X (SX)
TEST_TRIGGER_H TABLE Not Blocking Row-X (SX)
Según Oracle, el disparador esno estar bloqueado
Sin embargo, si trato de reemplazar el desencadenante mientras se ejecuta la instrucción INSERT, no se reemplazará hasta después de que se complete la instrucción (sin incluir un compromiso), lo que implica quees bloqueado
En esta situación, ¿está bloqueado el gatillo y, en caso afirmativo, cómo podría determinarse que lo está?