Değişen bir tablo hatasının en olası nedeni, tetikleyicilerin yanlış kullanımıdır. İşte tipik bir örnek:
- A tablosuna bir satır eklersiniz
- A tablosundaki bir tetikleyici (her satır için) A tablosunda bir sorgu yürütür, örneğin bir özet sütunu hesaplamak için
- Oracle bir ORA-04091 atar: tablo A değişiyor, tetikleyici / işlev görmeyebilir
Bu beklenen ve normal bir davranıştır, Oracle sizi garanti ettiği için sizi kendinizden korumak istiyor:
- (i) her ifadenin atomik olması (yani ya başarısız olur ya da tamamen başarılı olur)
- (ii) her bir ifadenin verilerin tutarlı bir görünümünü gördüğü
Büyük olasılıkla bu tür bir tetikleyici yazdığınızda, sorgunun (2), (1) üzerine eklenen satırı görmesini beklersiniz. Güncelleme henüz tamamlanmadığından bu yukarıdaki iki nokta ile çelişir (daha fazla satır eklenebilir).
Oracle olabilir bir zamana tutarlı sonuç döndürmek hemen önce ifade başında ama deneyin bu mantığı uygulamak olduğunu gördük örneklerin çoğunda gelen insanlar birbirini izleyen adımların bir serisi olarak çok sıralı deyimi görmek ve beklemek ifadesini [2] kullanarak önceki adımlarda yapılan değişiklikleri görebilirsiniz. Oracle beklenen sonucu döndüremez ve bu nedenle hatayı atar.
Daha fazla okuma için: Ask Tom'da "mutasyon tablosu" .
Mutasyon tablosu hatasının nedeninin bir tetikleyici olduğundan şüphelendiğimde, hatayı önlemenin bir yolu mantığı tetikleyiciden prosedürlere taşımaktır.