Czy spust można zablokować; Jak można ustalić, że tak jest?
W odpowiedziCzy przegapię jakiekolwiek zmiany, jeśli zastąpię wyzwalacz wyroczni podczas działania mojej aplikacji?Poszedłem sprawdzić, czy wyzwalacz został zablokowany przez instrukcję INSERT. Nie było i nie mogę znaleźć niczego w Internecie, aby zasugerować, że spust można zablokować.
Jeśli wykonam następujące czynności w jednej sesji:
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;
a następnie w drugiej sesji spróbuj dowiedzieć się, jakie blokady występują, otrzymuję następujące informacje:
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)
Według Oracle wyzwalaczem jestnie być zablokowanym.
Jeśli jednak spróbuję zastąpić wyzwalacz, gdy uruchomiona jest instrukcja INSERT, nie zostanie ona zastąpiona przed zakończeniem instrukcji (nie obejmuje zatwierdzenia), co oznacza, że wyzwalaczjest zablokowany.
Czy w tej sytuacji spust jest zablokowany, a jeśli tak, to w jaki sposób można to określić?