Trình kích hoạt không thể sửa đổi dữ liệu đã thay đổi (Inserted
hoặc Deleted
) nếu không, bạn có thể nhận được đệ quy vô hạn khi các thay đổi gọi lại kích hoạt. Một tùy chọn sẽ là để trình kích hoạt quay trở lại giao dịch.
Chỉnh sửa: Lý do cho điều này là tiêu chuẩn cho SQL là các hàng đã chèn và đã xóa không thể được trình kích hoạt sửa đổi. Lý do cơ bản là các sửa đổi có thể gây ra đệ quy vô hạn. Trong trường hợp chung, đánh giá này có thể liên quan đến nhiều trình kích hoạt trong một tầng đệ quy lẫn nhau. Việc có một hệ thống quyết định một cách thông minh việc cho phép các bản cập nhật như vậy là khó về mặt tính toán, về cơ bản là một biến thể của sự cố tạm dừng.
Giải pháp được chấp nhận cho điều này là không cho phép trình kích hoạt thay đổi dữ liệu đang thay đổi, mặc dù nó có thể khôi phục giao dịch.
create table Foo (
FooID int
,SomeField varchar (10)
)
go
create trigger FooInsert
on Foo after insert as
begin
delete inserted
where isnumeric (SomeField) = 1
end
go
Msg 286, Level 16, State 1, Procedure FooInsert, Line 5
The logical tables INSERTED and DELETED cannot be updated.
Một cái gì đó như thế này sẽ quay trở lại giao dịch.
create table Foo (
FooID int
,SomeField varchar (10)
)
go
create trigger FooInsert
on Foo for insert as
if exists (
select 1
from inserted
where isnumeric (SomeField) = 1) begin
rollback transaction
end
go
insert Foo values (1, '1')
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.