Etkilenen satır olmamasına rağmen tetikleme tetikleme


10

Bu daha genel bir sorudur, ancak bu sorunun motivasyonu SQL Server kullanırken karşılaştığım bir sorundu.

Bu tetikleyici, yan etkisi olarak, hiçbir satır takılı değilse hata artıracak bazı mantık içeren bir tablodaki Ekle olayına bağlı. Daha fazla araştırma yapıldığında, hiçbir satır eklenmemesine rağmen tetikleyicinin tetiklendiğini keşfettim.

DML Tetikleyicilerinde Microsoft Dokümanlar'da kullanılan dil bu davranışla çelişiyor gibi görünüyor:

DML tetikleyicileri, tetikleyicide tanımlanan tablo veya görünümü etkileyen bir DML olayı gerçekleştiğinde otomatik olarak geçerli olan özel bir saklı yordam türüdür.

Bu DBMS'ler için varsayılan bir davranış mı? Hiçbir satır etkilenmediğinde tetikleyici tetiklemek için özel bir neden var mı?

Yanıtlar:


24

DML eylemleri için satır tabanlı ve ifade tabanlı tetikleyiciler vardır.

  • Her satır etkilendiğinde (yerleştirildikten / güncellendi / silindiğinde) satır tetiklenir. Böylece 100 satır etkilenirse 100 kez ateşlenir ve 0 satır etkilenirse hiç olmaz.

  • Bir INSERT / UPDATE / DELETEdeyim yürütüldüğünde deyim tetiklenir . Hiçbir satırın etkilenmemesi önemli değildir. İfade seviyesi her durumda ve yalnızca bir kez bir açıklama için tetiklenir (ister 0, 100 ister milyar satır etkilenir).

Bazı DBMS yalnızca satır düzeyinde tetikleyicilere (MySQL) sahiptir.

Diğerleri ( DBMS'niz olan SQL Server * gibi ) yalnızca ifade düzeyi tetikleyicilerine sahiptir.

Diğerleri (DB2, Oracle, Postgres) her iki tür tetikleyiciye de sahiptir.


* SQL Server CREATE TRIGGERbelgeleri durumu:

DML, kullanıcı veri işleme dili (DML) olayı aracılığıyla verileri değiştirmeye çalıştığında yürütmeyi tetikler. DML olaylar INSERT, UPDATEya DELETEbir tablo veya görünüm bildirimler. Bu, herhangi bir tablo satırının etkilenip etkilenmediğine bakılmaksızın geçerli bir olay tetiklendiğinde tetiklenir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.