Tôi tự hỏi nếu tôi sẽ bỏ lỡ bất kỳ dữ liệu nào nếu tôi thay thế trình kích hoạt trong khi cơ sở dữ liệu oracle của tôi đang được sử dụng. Tôi đã tạo ra một ví dụ đồ chơi và có vẻ như tôi sẽ không, nhưng một trong những đồng nghiệp của tôi tuyên bố khác.Tôi có bỏ lỡ bất kỳ thay đổi nào nếu tôi thay thế trình kích hoạt oracle trong khi ứng dụng của tôi đang chạy không?
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
Thú vị. Tôi mong đợi các sự kiện sẽ bị bỏ qua nếu bạn đã tách riêng các câu lệnh 'drop' và' create'; nhưng không phải nếu bạn sử dụng 'tạo hoặc thay thế' khi bạn ở đây. Nhưng tôi không nghĩ rằng tôi đã nhìn thấy hành vi đó được ghi lại. –
Giả sử rằng bất kỳ câu lệnh DDL nào là một cam kết implicite hơn thuộc tính tuần tự của xử lý giao dịch nên giữ ... đó là bạn không nên bỏ lỡ các sự kiện. Tuy nhiên, sẽ rất thú vị nếu điều này được chỉ định. – Claude