SORU
1 Ocak 2009, PERŞEMBE


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
1 Ocak 2009, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BgirlNilaya

    BgirlNilaya

    29 EKİM 2008
  • BradleyWuzHere

    BradleyWuzHe

    25 NİSAN 2011
  • UnboxTechnology

    UnboxTechnol

    20 Ocak 2011