Tablo hatalarını mutasyona uğratmanın nedenleri ve çözümleri nelerdir?


12

Değişen tablo hatalarının bir tasarım kusuru veya sorunlu sorgudan kaynaklandığını anlıyorum.

Son zamanlarda mutasyona uğramış bir tablo hatası veren eski bir sorgu üretildi. DBA'mız sorunu çözdü ama nasıl yapacağımızı bilmiyoruz.

Değişen tablo hatalarına tam olarak ne neden olur ve DBA'mız sorunu nasıl düzeltir?

Yanıtlar:


17

Değişen bir tablo hatasının en olası nedeni, tetikleyicilerin yanlış kullanımıdır. İşte tipik bir örnek:

  1. A tablosuna bir satır eklersiniz
  2. 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
  3. 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.


9

Bir ifade bir tetikleyicinin tetiklenmesine neden olduğunda ve bu tetikleyici tetikleyiciye neden olan tabloya başvurduğunda bir mutasyon tablosu oluşur. Bu tür problemlerden kaçınmanın en iyi yolu tetikleyicileri kullanmamaktır, ancak DBA'nın bunu yapmak için zaman almadığından şüpheleniyorum. Aşağıdakilerden birini yapabilirdi:


1
En azından benim için, bir sonradan tetikleyici olarak değiştirmek 11.2.0.4.0'da başarısız oluyor
Yazılım Peygamberleri

Ayrıca benim için; sürüm 12.1.0.2.0 ve AFTER çalışmıyor.
eidylon
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.