SQL Server "SONRA EKLE" tetik değil't-eklenen satıra bakın
Bu tetikleyici düşünün:
ALTER TRIGGER myTrigger
ON someTable
AFTER INSERT
AS BEGIN
DELETE FROM someTable
WHERE ISNUMERIC(someField) = 1
END
Bir tablo, someTable var, ve kötü bir kayıt eklemek engellemek için çalışıyorum. Bu sorunun amacı, kötü bir kayıt alanı "tüm sayısal." someField vardır
Tabii ki, bunu yapmak için doğru yolu bir tetikleyici ile DEĞİL, ama kaynak kodu... sadece SQL veritabanı kontrol edemem. Gerçekten kötü satır ekleme engel olamam, ama benim ihtiyaçları için yeterince iyi olan hemen sil, ben.
Tetiği çalışır, bir sorun... ne zaman patlar, bunu asla görünüyor silmek için sadece eklenen kötü rekoru... siler herhangi bir ESKİ kötü kayıtları, ama olmuyor sil sadece eklenen kötü kayıt. Genellikle kötü bir sicili olan bir başkası gelip başka bir EKLEME yapana kadar silinmez etrafında yüzen var.
Bu tetikleyiciler benim anlamakta bir sorun mu var? Tetiği çalışırken yeni eklenen satırları henüz kararlı?
CEVAP
Değişiklikleri tekrar tetiği çağrılan olarak değiştirilemez verileri (Inserted
Deleted
) değiştir aksi halde sonsuz özyineleme alabilir tetikler. Bir seçenek tetiği geri hareket etmek olacak.
Düzenleme:Bunun nedeni SQL için standart eklenen ve silinen satır olamaz tetik tarafından değiştirilmiş olmasıdır. Altında yatan sebep değişiklikleri sonsuz özyineleme neden olabilir. Genel durumda, bu değerlendirme karşılıklı olarak özyinelemeli bir çağlayan tetikler birden fazla içerebilir. Sistemi akıllıca gibi güncellemeleri izni verilip verilmeyeceği olması açısından dirençli, halting problem. esasen bir çeşididir
Bu kabul çözüm geri hareket edebilir, ancak tetiği değişen verileri değiştirmek için izin vermektir.
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.
Böyle bir işlem geri döner.
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.
özel durum "ben İllegalStateExcep...
Neden Python's "Ekle" d...
Boşluk (&; " quot;) Ekle bir öğe k...
En iyi HTTP durum " için REST API ...
&; EKLE YOKSAY" vs "EKLE ......