tuyên bố INSERT
của bạn luôn chạy trong một giao dịch - một trong hai bạn đã xác định một cách rõ ràng, hoặc nếu không muốn nói , sau đó SQL Server sẽ sử dụng một giao dịch ngầm định.
Bạn đang chèn một (hoặc nhiều) hàng vào bảng của mình. Sau đó - vẫn còn bên trong giao dịch - kích hoạt AFTER INSERT
chạy và kiểm tra các điều kiện nhất định - thường sử dụng bảng giả Inserted
có sẵn bên trong trình kích hoạt, chứa các hàng đã được chèn.
Nếu bạn gọi ROLLBACK TRANSACTION
trong kích hoạt của bạn, sau đó có - giao dịch của bạn, với tất cả những gì nó đã làm, là cuộn lại và nó như thể đó INSERT
bao giờ xảy ra - không có gì xuất hiện trong bảng cơ sở dữ liệu của bạn.
Ngoài ra: FOR INSERT
cũng giống như AFTER INSERT
trong SQL Server - cò được thực hiện sau khi tuyên bố INSERT
đã làm công việc của mình.
Một điều cần lưu ý (mà rất nhiều lập trình viên có được sai): kích hoạt là bắn một lần mỗi đợt - KHÔNG một lần cho mỗi hàng! Vì vậy, nếu bạn chèn 20 hàng cùng một lúc, trình kích hoạt được kích hoạt sau khi và bảng giả Inserted
bên trong trình kích hoạt chứa 20 hàng. Bạn cần tính đến điều đó khi viết trình kích hoạt - bạn đang không phải luôn xử lý chỉ một hàng đang được chèn!
Nguồn
2012-11-14 06:25:00
@MitchWheat: giao dịch sẽ luôn tồn tại - không? Rõ ràng hoặc ngầm định. Và việc khôi phục sẽ chấm dứt giao dịch đó và hoàn tác mọi thứ mà giao dịch này đang cố gắng thực hiện cho bảng. –
Có, xin lỗi Marc, đó là chính xác. Tôi có nghĩa là một giao dịch rõ ràng. Tôi nghĩ rằng tôi có thể đã lúng túng nước ... Tôi sẽ xóa bình luận trước đó. –
Bạn lấy các giá trị đó ở đâu '@ InstructorNo' và' @ AreaName' từ ?? Về cơ bản, nếu bạn gọi 'ROLLBACK TRANSACTION' trong trigger của bạn, bạn sẽ ** dừng và hủy bỏ **' INSERT' của bạn và không có hàng nào được chèn vào ở tất cả –