Kích hoạt bắn mặc dù không có hàng nào bị ảnh hưởng


10

Đây là một câu hỏi chung nhưng động lực cho câu hỏi này là một vấn đề tôi gặp phải khi sử dụng SQL Server.

Tôi có trình kích hoạt này được đính kèm với một sự kiện Chèn trên bảng có chứa một số logic, như là một hiệu ứng phụ, sẽ gây ra lỗi nếu không có hàng nào được chèn. Khi điều tra sâu hơn, tôi phát hiện ra rằng cò súng đã bắn mặc dù không có hàng nào được chèn vào.

Ngôn ngữ được sử dụng trong Microsoft Docs trên DML Triggers dường như mâu thuẫn với hành vi này:

Các trình kích hoạt DML là một loại thủ tục được lưu trữ đặc biệt tự động có hiệu lực khi một sự kiện DML diễn ra có ảnh hưởng đến bảng hoặc dạng xem được xác định trong trình kích hoạt.

Đây có phải là hành vi mặc định trên các DBMS không? Có một lý do cụ thể để kích hoạt một kích hoạt khi không có hàng nào bị ảnh hưởng?

Câu trả lời:


24

Đối với các hành động DML, có các kích hoạt dựa trên hàng và dựa trên câu lệnh.

  • Hàng kích hoạt kích hoạt khi (trước, sau hoặc thay vì) mỗi hàng bị ảnh hưởng (chèn / cập nhật / xóa). Vì vậy, họ sẽ bắn 100 lần nếu 100 hàng bị ảnh hưởng và hoàn toàn không bị ảnh hưởng nếu 0 hàng bị ảnh hưởng.

  • Câu lệnh kích hoạt khi một INSERT / UPDATE / DELETEcâu lệnh được thực thi. Không có vấn đề gì nếu không có hàng nào bị ảnh hưởng. Mức độ câu lệnh kích hoạt dù sao và chỉ một lần cho một câu lệnh (cho dù đó là 0, 100 hay một tỷ hàng bị ảnh hưởng).

Một số DBMS chỉ có trình kích hoạt cấp hàng (MySQL).

Những người khác (như SQL Server * là DBMS của bạn) chỉ có các trình kích hoạt mức câu lệnh.

Một số loại khác (DB2, Oracle, Postgres) có cả hai loại kích hoạt.


* Trạng thái CREATE TRIGGERtài liệu SQL Server :

Kích hoạt DML thực thi khi người dùng cố gắng sửa đổi dữ liệu thông qua sự kiện ngôn ngữ thao tác dữ liệu (DML). Các sự kiện DML là INSERT, UPDATEhoặc các DELETEcâu lệnh trên một bảng hoặc dạng xem. Các kích hoạt này kích hoạt khi bất kỳ sự kiện hợp lệ nào được kích hoạt, bất kể có bất kỳ hàng bảng nào bị ảnh hưởng hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.