2012-04-16 32 views
42

Tôi gặp khó khăn trong việc hiểu sự khác biệt giữa 'trình kích hoạt cấp hàng' và 'trình kích hoạt cấp câu lệnh'.trình kích hoạt cấp hàng và trình kích hoạt cấp độ tuyên bố

Từ sự hiểu biết của tôi, trong kịch bản trình kích hoạt mức báo cáo được tạo, toàn bộ bảng có thể được sửa đổi. Trình kích hoạt cấp hàng sẽ chỉ cho phép tôi sửa đổi bộ dữ liệu bị ảnh hưởng bởi sự kiện cụ thể của trình kích hoạt.

Điều này có đúng không? Có ai có ví dụ về cả hai không?

Cảm ơn!

Trả lời

67

Sự khác biệt chính không phải là những gì có thể được sửa đổi bởi trình kích hoạt, điều đó phụ thuộc vào DBMS. Trình kích hoạt (hàng hoặc mức báo cáo) có thể sửa đổi một hoặc nhiều hàng, cùng bảng hoặc các bảng khác và có thể có các hiệu ứng xếp tầng (kích hoạt các hành động/trình kích hoạt khác) nhưng tất cả đều phụ thuộc vào DBMS.

Sự khác biệt chính là kích hoạt trình kích hoạt bao nhiêu lần. Hãy tưởng tượng bạn có một hàng bảng 1M và bạn chạy:

UPDATE t 
SET columnX = columnX + 1 

Một cò tuyên bố cấp sẽ được kích hoạt lần (và thậm chí nếu không có hàng được cập nhật). Trình kích hoạt cấp hàng sẽ được kích hoạt một triệu lần, một lần cho mỗi hàng được cập nhật.


Sự khác biệt khác là thứ tự hoặc kích hoạt. Ví dụ trong Oracle 4 loại khác nhau của trigger sẽ được kích hoạt theo thứ tự sau đây:

Before the triggering statement executes 
Before each row that the triggering statement affects 
After each row that the triggering statement affects 
After the triggering statement executes 

Trong ví dụ trước, chúng tôi muốn có một cái gì đó như:

Before statement-level trigger executes 

    Before row-level trigger executes 
    One row is updated 
    After row-level trigger executes 

    Before row-level trigger executes 
    Second row is updated 
    After row-level trigger executes 

    ... 

    Before row-level trigger executes 
    Millionth row is updated 
    After row-level trigger executes 

After statement-level trigger executes 
+0

Vì vậy, trình kích hoạt cấp câu lệnh có thể sửa đổi một hàng, trong khi mức hàng sẽ có thể sửa đổi mỗi hàng trong bảng? –

+2

Không, trình kích hoạt cấp hàng có thể được sử dụng để cập nhật/xóa/chèn nhiều hàng. Hoặc các hàng trong các bảng khác. –

+1

Và trình kích hoạt cấp tuyên bố cũng vậy. –

17

Bạn có thể muốn hành động để kích hoạt thực hiện một lần sau khi máy khách thực hiện một câu lệnh sửa đổi một triệu hàng (trình kích hoạt mức tuyên bố). Hoặc, bạn có thể muốn kích hoạt hành động một lần cho mỗi hàng được sửa đổi (kích hoạt cấp hàng).

VÍ DỤ: Giả sử bạn có trình kích hoạt để đảm bảo tất cả học sinh trung học đều tốt nghiệp. Đó là, khi một cấp lớp cao cấp là 12, và chúng tôi tăng nó lên 13, chúng tôi muốn thiết lập các lớp để NULL.

Đối với trình kích hoạt cấp câu lệnh, bạn muốn nói, sau khi câu lệnh tăng cấp chạy, hãy kiểm tra toàn bộ bảng một lần để cập nhật bất kỳ nows nào có lớp 13 đến NULL.

Đối với một row-level kích hoạt, bạn muốn nói, sau mỗi hàng đó được cập nhật, cập nhật lớp hàng mới để NULL nếu nó là 13.

Một cò tuyên bố cấp sẽ trông như thế này:

create trigger stmt_level_trigger 
after update on Highschooler 
begin 
    update Highschooler 
    set grade = NULL 
    where grade = 13; 
end; 

và một row-level kích hoạt sẽ trông như thế này:

create trigger row_level_trigger 
after update on Highschooler 
for each row 
when New.grade = 13 
begin 
    update Highschooler 
    set grade = NULL 
    where New.ID = Highschooler.ID; 
end; 

Lưu ý rằng SQLite không hỗ trợ trigger tuyên bố cấp, vì vậy trong SQLite, các FOR EACH ROW là tùy chọn.

0

mức tuyên bố kích hoạt là một lần duy nhất cho DML tuyên bố hàng Leval kích hoạt là cho mỗi hàng cho báo cáo DML

0

nếu bạn muốn thực hiện báo cáo kết quả khi số lượng hàng được sửa đổi sau đó nó có thể được có thể bằng cách trigger mức tuyên bố. viseversa ... khi bạn muốn thực hiện tuyên bố của mình mỗi sửa đổi về số hàng của bạn thì bạn cần phải thực hiện các kích hoạt mức hàng ..

ví dụ: trình kích hoạt mức báo cáo hoạt động khi bảng được sửa đổi..then số lượng hồ sơ nhiều hơn được thực hiện. và hàng mức gây nên tác phẩm cho mỗi khi updation hàng hoặc sửa đổi ..

1

Sự khác biệt chính giữa mức tuyên bố kích hoạt là dưới đây:

tuyên bố mức độ kích hoạt: dựa trên tên nó hoạt động nếu bất kỳ tuyên bố được thực thi. Không phụ thuộc vào số lượng hàng hoặc bất kỳ hàng nào bị ảnh hưởng. Nó chỉ thực hiện một lần. Exp: nếu bạn muốn cập nhật lương của mỗi nhân viên từ bộ phận nhân sự và cuối cùng bạn muốn biết có bao nhiêu hàng được thực hiện có nghĩa là có bao nhiêu tiền lương tăng sau đó sử dụng kích hoạt mức báo cáo. xin lưu ý rằng trình kích hoạt sẽ thực thi ngay cả khi không có hàng nào được cập nhật vì nó là trình kích hoạt mức báo cáo được gọi nếu bất kỳ câu lệnh nào đã được thực hiện. Không có vấn đề nếu nó đang ảnh hưởng đến bất kỳ hàng hay không.

Trình kích hoạt cấp hàng: thực hiện mỗi lần một hàng bị ảnh hưởng. nếu không có hàng bị ảnh hưởng.không có cấp độ kích hoạt hàng sẽ thực thi.suppose nếu u muốn xóa một employye từ bảng emp có bộ phận là nhân sự và u muốn ngay sau khi nhân viên bị xóa khỏi bảng emp đếm trong bảng dept từ phần nhân sự nên được giảm bởi 1. sau đó bạn nên lựa chọn kích hoạt cấp hàng.

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