2013-08-26 20 views
6

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 
+2

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. –

+0

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

Trả lời

0

Tôi nghĩ bạn có thể sẽ thử nghiệm điều này theo cách sai. Các câu lệnh chèn của bạn sẽ không mất chút thời gian nào và do đó việc thay thế kích hoạt có thể phù hợp với các khoảng trống giữa các lần chèn. Ít nhất đây là những gì tôi suy ra do dưới đây.

Nếu bạn thay đổi thử nghiệm để đảm bảo bạn có câu lệnh SQL dài chạy, ví dụ:

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;  
/

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

Nếu bạn sau đó cố gắng thay thế cò trong một riêng phiên nó sẽ không xảy ra cho đến sau khi chèn đã hoàn thành.

Rất tiếc, tôi không thể tìm thấy bất kỳ nội dung nào trong tài liệu để sao lưu tôi; đây chỉ là hành vi mà tôi biết.

1

create or replace đang khóa bảng. Vì vậy, tất cả các chèn sẽ đợi cho đến khi nó hoàn thành. Đừng lo lắng về việc bị nhét.

0

Làm theo các câu trả lời URL sau đây trình kích hoạt có thể được sửa đổi trong khi ứng dụng đang chạy. nó sẽ là một khóa "cache thư viện" và KHÔNG phải là khóa "dữ liệu". Oracle xử lý nội bộ mà không cần phải lo lắng về nó.

Kiểm tra câu hỏi nêu ra bởi Ben- Can a trigger be locked; how would one determine that it is?

- Khởi này từ phiên 2: select * from v $ truy cập nơi đối tượng = trên ('test_trigger_t');

Các vấn đề liên quan