Yan etkileri olan standart SQL fonksiyonları var mı?


11

SQL standartları yan etkileri olan işlevleri tanımlıyor mu?

Örneğin, dosyalara * yazma veya benzer bir şey yaptığınızda tablonun belirli sütunlarındaki değerleri güncelleme işlevleri var mı?

SELECT myfunction(params...);

Bunları bazen gördüm, ancak SQL standartlarının aynı olup olmadığını merak ediyorum.


* Bu özellikle PostgreSQL ile ilgili bir soru değildir. Sadece PostgreSQL'de gördüğüm yan etkilerden örnekler kullanıyorum.


İşlevler farklı platformlarda çok farklıdır, ancak evet, örneğin e-posta göndermek için Oracle'da oldukça standart (yani Oracle tarafından sağlanan) eklenti işlevleri vardır. SQL Server'da NEWID ve RAND gibi belirsiz olmayan işlevler vardır ve SQL Server'daki işlevler genişletilmiş yordamlar olarak da adlandırılabilir.
Cade Roux

3
Sorunuz, " SQL standart fonksiyonları içermez sahip yan etkileri Cevabın hayır olduğunu düşünüyorum". Eğer soru " SQL standardı yan etkileri olan fonksiyonların yazılmasına izin veriyor mu? " İse cevabın evet olduğunu düşünüyorum.
a_horse_with_no_name

@a_horse_with_no_name, Teşekkürler. Sorum, stil ve konvansiyonla ilgili eski idi.
tinlyx

Yanıtlar:


18

Burada birkaç farklı sorunuz var.

S: ANSI standart SQL işlevleri nelerdir?

ANSI standart fonksiyonları AVG, COUNT, MIN, MAX gibi şeylerdir. 1992 ANSI standardında yer alıyorlar , ancak bu kuru ve sıkıcı bir okuma heck.

S: ANSI standart SQL işlevleri veritabanındaki verileri değiştiriyor mu?

Hayır. Verileri değiştirmek için bunları kullanabilirsiniz - örneğin şunu söyleyebilirim:

INSERT INTO dbo.MyReport SELECT MAX(SalespersonRevenue) FROM dbo.Sales

Ancak, kendi başlarına, sadece bir AVG, COUNT, MIN, MAX vb. Kullanımı veritabanınızdaki verileri kalıcı olarak değiştirmemelidir.

S: ANSI standardı kendi işlevlerimi yazmama izin veriyor mu?

Evet, ancak tam uygulama satıcıdan satıcıya değişir. Yazdığınız işlevler ANSI dil standardına uygun olabilir, ancak işlevinizin içinde yaptıklarınız yan etkiler yaratmak gibi korkunç derecede korkunç olabilir.

  • Amaçlanan davranışı tartışırken , platformlar arası bir cevap almak mümkündür.
  • Yan etkileri tartışırken , öyle değil.

S: Veri yazmak için kendi işlevimi oluşturabilir miyim?

Neden eminseniz, yaratıcıysanız. Ben bir Microsoft SQL Server kullanıcısıyım, bu yüzden bu platforma odaklanacağım. Books Online'ın işlev sayfası şöyle diyor:

Kullanıcı tanımlı işlevler, veritabanı durumunu değiştiren eylemleri gerçekleştirmek için kullanılamaz.

Hangi diyorum ki:

Sen benim gerçek babam değilsin.

İşte kuralları nasıl kıracağım. Uyarı: Çok kötü fikirler geliyor.

  • İşlevinizde, bu kötü amaç için özel olarak oluşturulan yeni bir tabloyu sorgulayın ve sonra tabloyu belirli ifadeler için izleyen ve ardından bir eylemi tetikleyen bir şey oluşturun (Genişletilmiş Olaylar, denetim veya Profiler izlemesi). Bu belirli ifadelere dayanarak iş yapmak için bir Rube Goldberg çeşit mekanizmasını birbirine bağlayabilirsiniz.
  • Fonksiyonda, CLR kodunu arayın - heck, bir web servisini bile arayabilirsiniz . Bu web hizmeti çok iyi kendi veritabanına veri itebilir.
  • İşlevde, xp_cmdshell'i arayın ve komut isteminden bir şey yapın. (HT @AaronBertrand yorumlarda.)

Tüm bu örneklerin performans ve işlem tutarlılığı şeklinde büyük dezavantajları vardır. Sadece teorik olarak yapılıp yapılamayacağını sordunuz ve cevap evet. Bunlardan hiçbirini kendi kodumda kullanmazdım - geri çekilip, "Burada elde etmeye çalıştığım iş hedefi nedir ve performans ve işlem tutarlılığı sağlamak için yapabileceğim bir yol var. ?" Bunlarla ilgili özel tavsiyeler almak isterseniz, ayrıntılarla birlikte ayrı bir Stack sorusu sorarım.


Teşekkürler. PSM, SQL standardının olmadığı göz önüne alındığında bir işlevin veya prosedürün yan etkisi olmasına izin veriyor mu?
Tim


-3

Sadece SQL Server ile ilgili kesin konuşabilirim ve bu tüm veritabanı uygulamaları arasında tutarlı değil gibi görünüyor. Ancak SQL Server'da işlevler yan etkiler üretmeyebilir. Bu, başarılı olamadan birkaç kez atlatmaya çalıştığım zor ve hızlı bir kuraldır.

Genel anlamda işlevler düşünüyorsanız, yan etkilere izin veren SQL modülleri vardır (örneğin saklı yordamlar), ancak kullanıcı tanımlı işlevler izin vermez.

Özellikle Microsoft ürünleri için geçerli olan bir "Akıllı Çözümler Ölçeklendirme" söz konusudur. MS, gerçek özellikler olarak ekledi çünkü SQL Server'ın önceki sürümlerinde sonraki sürümlerde kullanılmayan bir dizi akıllı geçici çözüm gördüm.

Dürüst olmak gerekirse, asla özellik haline gelmeyenler asla özellik haline gelmedi çünkü T-SQL geliştirmenin temelini bozmuşlardı. Fonksiyonlardaki yan etkiler bunlardan biridir.


Yorumlar uzun tartışmalar için değildir; bu görüşme sohbete taşındı .
Paul White 9
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.