Zastanawiam się, czy będę tęsknił za jakimikolwiek danymi, jeśli wymienię spust, gdy moja baza danych Oracle będzie w użyciu. Stworzyłem przykład zabawki i wygląda na to, że tego nie zrobię, ale jeden z moich współpracowników twierdzi inaczej.Czy będę tęsknić za wszelkimi zmianami, jeśli wymieniam wyzwalacz Oracle, gdy moja aplikacja jest uruchomiona?
create table test_trigger (id number);
create table test_trigger_h (id number);
create sequence test_trigger_seq;
--/
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;
/
--/
begin
for i in 1..100000 loop
insert into test_trigger (id) values (test_trigger_seq.nextval);
end loop;
end;
/
--/
begin
for i in 1..10000 loop
execute immediate '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;';
end loop;
end;
/
ran the two loops at the same time
select count(1) from test_trigger;
COUNT(1)
100000
select count(1) from test_trigger_h;
COUNT(1)
100000
Interesujące. Spodziewam się, że zdarzenia zostaną pominięte, jeśli oddzielisz instrukcje 'drop' i' create'; ale nie, jeśli użyjesz opcji "utwórz lub zastąp", tak jak tu jesteś. Ale nie sądzę, że widziałem to zachowanie udokumentowane. –
Załóżmy, że każda instrukcja DDL jest implikowanym zatwierdzeniem, niż powinna zachowywać się sekwencyjna właściwość przetwarzania transakcji ... nie powinieneś przegapiać zdarzeń. Byłoby jednak interesujące, gdyby zostało to określone. – Claude