MySQL saklı yordamlarında dinamik SQL


Yanıtlar:


8

Soruyu duymak beni iki açıdan düşündürüyor:

GÖRÜNÜM 1: Fonksiyonların DETERMİNİSTİK OLMASI

Bu durumda, bu, bir fonksiyonun belirli bir parametre seti için aynı dönüş verisini tutarlı bir şekilde sunması gerektiği anlamına gelir, FONKSİYONU ARAMADIĞINIZ ÖNEMLİ DEĞİLDİR.

Şimdi, fonksiyondaki statik SQL'e dayanarak günün farklı saatlerinde veri toplanması nedeniyle farklı bir cevap üreten bir fonksiyon düşünün. Bir anlamda, aynı parametre kümesi verildiğinde, her seferinde aynı tablo ve sütun kümesini sorgularsanız, yine de DETERMINISTIC olarak düşünülebilir.

Dinamik SQL ile bir işlevin temel tablolarını değiştirebilirseniz ne olur? Bir DETERMINISTIC işlevinin tanımını ihlal ediyorsunuz.

MySQL'in /etc/my.cnf dosyasına bu seçeneği eklediğine dikkat edin

log-bin-trust-function-creators

Her ne kadar bu bir aşırı basitleştirme olsa da, bu işlevlerin DETERMINISTIC özelliğini kesin olarak uygulamadan ikili günlüklere veri yazmasına izin verilmesine izin verir.

GÖRÜNÜM 2: Tetikleyiciler geri alınabilmelidir

  • Bir işlevle aynı davranışlara sahip bir tetikleyici düşünebilir ve daha sonra karışıma Dinamik SQL ekleyebilir misiniz?
  • Tetikleyicinin amaçlandığı temel tabloya MVCC'yi uyguladıktan sonra Dinamik SQL'e karşı MVCC (Multiversion Concurrecy Control) uygulamaya çalıştığınızı hayal edebiliyor musunuz?

Aslında sadece MVCC'de kuadratik (hatta katlanarak) büyüyen verilere sahip olacaksınız. DETERMINISTIC olmayan tetikleyicilerle SQL'in geri alınmasını yönetme süreci, en azından söylemek gerekirse, oldukça karmaşık olacaktır.

Bu iki yönün ışığında, eminim MySQL Geliştiricileri bunları düşündü ve kısıtlamalar uygulayarak onları hızla görevden aldı.

Öyleyse, Prosedür kısıtlamasını neden kaldırmalıyım? Basitçe söylemek gerekirse, DETERMINISTIC özellikleri veya Geri Alma ile ilgili bir endişe yoktur.


3
Diğer DBMS tetikleyiciler MVCC ve dinamik SQL çok iyi destekleyebilir eğer öylesine "ungodly karmaşık" olamaz.
a_horse_with_no_name

1
Aslında, @a_horse_with_no_name, haklısın. Oracle ve PostgreSQL için, ungodly karmaşık kodlanmıştır. Yorumunuz için +1. MySQL, birden fazla depolama motoruyla uğraşma özürüne sahiptir, bu nedenle geri alma ve determinizm, depolama motoru işlemlerinin çakışmasını gerektirebilir. Bu biraz korkutucu. Belki birileri tam anlamıyla InnoDB'ye "ungodly kompleks" i itme cesaretine sahip olacak. Depolama motorunun aynı sorguda karıştırılmasına izin vermeyecek şekilde depolama motoruna özgü tetikleme uygulaması oluşturmak daha da arzu edilir olacaktır.
RolandoMySQLDBA

5

Bu harika bir soru, ama cevabı bilmiyorum. Bunun iç ekibine gitmesi gerektiğini düşünüyorum, ancak bu sitede büyük olacaklarını bilmiyorum. Bu arada, bazı cevaplar çıkarmanıza yardımcı olabilirim.

Yeni başlayanlar için şunu görüyorum:

Tetikleyici önbellek, temeldeki nesnelerin meta verilerinin ne zaman değiştiğini algılamaz. Bir tetikleyici bir tablo kullanıyorsa ve tetikleyici önbelleğe yüklendikten sonra tablo değiştiyse, tetikleyici eski meta verileri kullanarak çalışır.

Bu beni bununla bir ilgisi olduğunu düşündürüyor. Meta verileri bile izlemiyorsa SQL'i yeniden derlemeyecektir. Bu da motorla ilgili bir sorun olduğu anlamına geliyor.

Aynı şekilde, bu bloğu okuduğumda aynı şeyi düşünüyorum (motor):

Sunucu iş parçacıkları arasındaki etkileşim sorunlarını önlemek için, istemci bir deyim yayınladığında, sunucu deyimin yürütülmesi için kullanılabilen rutinlerin ve tetikleyicilerin anlık görüntüsünü kullanır. Yani sunucu, ifadenin yürütülmesi sırasında kullanılabilecek yordamların, işlevlerin ve tetikleyicilerin bir listesini hesaplar, yükler ve sonra ifadeyi yürütmeye devam eder. Bu, deyim yürütülürken, diğer iş parçacıkları tarafından gerçekleştirilen rutin değişikliklerini görmeyeceği anlamına gelir.

Sonuçta neden izin vermediklerinden tam olarak emin değilim, ama tahmin edebiliyorum. Sana daha fazla yardım edemediğim için üzgünüm, bunu biraz daha dışa vurmaya açığım. En iyisi, özel beta'dan ayrıldıktan sonra bazı aktif MySQL geliştiricileri için umut etmek;


1

Büyük ölçüde güvenlikten kaynaklanıyor. Yordamlar için istisna, yordam içindeki dinamik SQL'e yürütme kullanıcısının güvenlik bağlamının atanabilmesidir. Bu, motorun ne yapılacağını bilmese de, kullanıcının başvurulan nesnelere erişmesine izin verebileceğini gösterir.

Bunun ötesinde, izin verilebilirse, olabileceklerin çirkin meselelerini gündeme getirebilirsiniz.

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.