Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Um gatilho pode ser bloqueado; como alguém determinaria que é?


Para determinar se um gatilho (assim como qualquer outro procedimento armazenado) está bloqueado ou não, o V$ACCESS visualização de desempenho dinâmico pode ser consultada.
Session #1

insert into test_trigger
 select level
   from dual
connect by level <= 1000000; 

Session #2

SQL> select *
  2    from v$access
  3   where object = upper('test_trigger_t')
  4  ;


Sid  Owner  Object         Type    Con_Id 
--------------------------------------
441  HR     TEST_TRIGGER_T TRIGGER  3 

Esses tipos de cadeados são pinos de cache de biblioteca (os bloqueios de cache de biblioteca são resource(TM tipo de bloqueio)), necessários para garantir que um objeto seja protegido contra modificações enquanto a sessão o executa.
--session sid # 441
insert into test_trigger
  select level
    from dual
 connect by level <= 1000000;


-- session sid #24
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;  

-- Session # 3
select vs.sid
     , vs.username
     , vw.event
  from v$session       vs
  join v$session_wait  vw
    on (vw.sid = vs.sid)
  join v$access        va
    on (va.owner = vs.username)
 where vs.username = 'HR'

Resultado:
Sid Username Event 
--------------------------
24 HR library cache pin 
....
441 HR log file switch (checkpoint incomplete) 

Aqui podemos ver que a sessão #441 aguarda uma troca de arquivo de log e a sessão #24 aguarda o pino do cache da biblioteca.