Bazı Gözlemler
Saklı yordamlar size kodun yeniden kullanılmasını ve kapsüllemeyi (yazılım geliştirmenin iki sütunu) verir,
Bunları yalnızca, kullanılması gereken bağlamda doğru kullanırsanız. Aynı iddia, işlevler (yapısal programlamada) veya yöntemler (nesne yönelimli programlamada) hakkında da söylenebilir ve yine de, 1K işlevlerini ve mega-ass nesnelerini görüyoruz.
Eserler size bu faydaları vermez. Bu eserlerin doğru kullanımı, bu faydaları sağlayan şeydir.
güvenlik (saklanan bireysel işlemlere izin verebilirsiniz / iptal edebilirsiniz),
Evet. Bu iyi bir nokta ve saklı yordamları sevmemdeki temel nedenlerden biri. Genelde sadece görünümler ve kullanıcı hesapları ile elde edilebileceklerden daha hassas bir erişim kontrolü sağlarlar.
sizi SQL enjeksiyon saldırılarından korumak,
Bu, SP'lere özgü değildir, çünkü parametrelenmiş SQL ifadeleri ve giriş fırçalama ile aynı koruma seviyesini sağlayabilirsiniz. Bununla birlikte, SP'leri "derinlemesine güvenlik" olarak da kullanırdım .
ve ayrıca hız konusunda yardımcı olur (DBA, SQL Server 2008'den başlayarak, düzenli SQL sorgularının bile yeterince çalıştırılırsa derlendiğini söylese de).
Bu oldukça veritabanı satıcısına özgüdür, ancak genel olarak DBA'nız doğrudur. SQL ifadeleri (statik veya parametrized) derlenir. SP'ler, basit SQL ifadeleriyle yapamayacağınız verileri toplamanız ve hesaplamanız gerektiğinde / hesapladığınızda, ancak SQL ile sıkı bir şekilde tümleştirildiyse ve uygulama sunucusuna gidiş gelişini garanti etmiyorsa yardımcı olur.
Bunun iyi bir örneği, verileri başka bir SQL'in çalıştırılacağı geçici bir imleç (veya imleçler) içine sorgulamaktır. Uygulama sunucusunda programlı olarak yapabilirsiniz veya db de yaparak çoklu gidiş gelişleri kaydedebilirsiniz.
Ancak bu norm olmamalıdır. Bu vakaların çoğuna sahipseniz, bu kötü veritabanı tasarımının bir işaretidir (ya da departmanlar arasında bu kadar uyumlu olmayan veritabanı şemalarından veri alıyorsunuz).
Agile yazılım geliştirme metodolojisini kullanarak karmaşık bir uygulama geliştiriyoruz.
Çeviklik, teknolojilerle değil, yazılım mühendisliği süreçleri ve ihtiyaç yönetimi ile ilgilidir.
Saklı procs kullanmak istememelerinin nedenlerini düşünen var mı?
Yanlış soru
Soru yanlıştır ve "GOTO'yu kullanmamak için iyi bir sebep var mı?" Niklaus Wirth ile Dijkstra'ya bu konuda daha fazla katılıyorum. Dijkstra'nın hissiyatının nereden geldiğini anlayabiliyorum, ancak her durumda% 100 uygulanabilir olduğuna inanmıyorum. Mağaza procs ve herhangi bir teknoloji ile aynı.
Bir araç, amaçlanan amacı için iyi kullanıldığında ve belirli bir görev için en iyi araç olduğunda iyidir. Aksi halde kullanılması, aletin yanlış olduğunu, ancak avcının ne yaptığını bilmediğini gösterir.
Doğru soru, "ne tür saklı yordam kullanım şekillerinden kaçınılması gerektiği" dir. Veya, "hangi koşullar altında saklı yordamları kullanmalıyım (veya kullanmamalıyım)" . Nedenlerle Looking değil mühendisi içinde - onu ait kare mühendislik sorumluluğu yerleştirmek aksine bir teknoloji basitçe aracı suçu koyuyor kullanmak.
Başka bir deyişle, bu bir kopuş veya cehalet ifadesidir.
Tahminime göre, DBA'lar bu depolanan süreçleri sürdürmek istemedi, ancak böyle bir tasarım kararını haklı çıkarmak için çok fazla olumsuzluk var gibi görünüyor.
O zaman yaptıkları şey kötü mühendislik kararlarının sonuçlarını zayıf kullandıkları araçlara yansıtmak.
Senin durumunda ne yapmalı?
Benim deneyimim, Roma’da Romalılar gibi yapmak .
Onunla savaşma. Şirketinizdeki insanlar mağaza procs'larını kötü bir uygulama olarak etiketlemek istiyorsa, izin verin. Bununla birlikte, mühendislik uygulamalarında bunun bir kırmızı bayrak olabileceğine dikkat edin.
Şeylerin kötü uygulama olarak tipik olarak etiketlenmesi, genellikle tonlarca beceriksiz programcının bulunduğu kuruluşlarda yapılır. Kuruluş, bazı şeyleri kara listeye alarak, içsel olarak verdiği hasarı kendi yetersizliği nedeniyle sınırlamaya çalışır. Ben seni umursamıyorum
Genellemeler, bütün sıkıntıların anasıdır. Depolanan işlemlerin (veya herhangi bir tür teknolojinin) kötü bir uygulama olduğunu söylemek, bu bir genellemedir. Genellemeler yetersiz olanların kopyalarıdır. Mühendisler açık genellemelerle çalışmazlar. Durum bazında analiz yaparlar, analizleri yaparlar ve bir problemi çözmeleri gereken bağlamda eldeki gerçeklere göre mühendislik kararları ve çözümleri uygularlar.
İyi mühendisler, işleri kötü uygulama olarak etiketlememektedir. Probleme bakarlar, uygun olan aracı seçerler, takas yaparlar. Başka bir deyişle, mühendislik yapıyorlar.
Onları nasıl kullanmayacağına dair fikrim
Onlarda veri toplamanın (ve belki de bazı dönüşümlerin) ötesine karmaşık bir mantık koymayın. Bazı veri masaj mantığını bunlara eklemek veya onlarla yapılan birden çok sorgunun sonucunu toplamak mümkündür. Ama bu konuda. Bunun ötesinde bir şey, başka bir yerde bulunması gereken iş mantığı olarak nitelendirilebilir.
Bunları SQL enjeksiyonuna karşı tek savunma mekanizması olarak kullanmayın. Onlara kötü bir şeyler yapması durumunda onları orada bırakırsınız , ancak önlerinde bir miktar savunma mantığı olmalı - müşteri tarafında doğrulama / ovma, sunucu tarafında doğrulama / ovma, muhtemelen sizin türünüze anlam veren türlere dönüştürme etki alanı modeli ve nihayet parametreleştirilmiş ifadelere geçilmesi (bu, SQL ifadeleri parametreli hale getirilmiş veya depolanmış işlemlerin parametreleştirilmesi olabilir).
Veritabanlarını mağaza işlemlerinizi içeren tek yer yapmayın. Mağaza işlemleriniz, C # veya Java kaynak kodunuzu değerlendirdiğiniz gibi işlenmelidir. Yani kaynak, mağaza işleminizin metinsel tanımını kontrol eder. İnsanlar, mağaza işlemlerinin kaynak kontrollü olamayacağını söylüyorlar - saçmalık, ne hakkında konuştuklarını bilmiyorlar.
Bunları nasıl / nerede kullanacakları konusundaki fikrim
Uygulamanız, birden çok sorgu veya görünümden aktarılması veya toplanması gereken verileri gerektiriyor. Bunu uygulamadan db'ye boşaltabilirsiniz. Burada bir performans analizi yapmanız gerekir, çünkü a) veritabanı motorları bu gibi şeyleri yaparken uygulama sunucularının daha verimli olmasına rağmen, b) uygulama sunucularının (bazen) yatay olarak ölçeklendirilmeleri daha kolaydır.
İnce taneli erişim kontrolü. Bazı gerizekalı çalışan kartezyen ortaklarının db'nizde yer almasını istemiyorsunuz, ancak insanların böyle bir SQL deyimini de aynı şekilde çalıştırmalarını yasaklayamıyorsunuz. Tipik bir çözüm, geliştirme ve UAT ortamlarında rasgele SQL ifadelerine izin verirken, en sist ve üretim ortamlarında bunları yasaklamaktır. Bunu gizlice veya prodüksiyona sokması gereken her türlü ifade, hem geliştiriciler hem de dbas tarafından kod incelemesi yapılan bir mağaza prosedürüne girer.
Bir mağaza işleminde olmayan bir SQL ifadesini çalıştırmanın herhangi bir geçerli gereksinimi, farklı bir kullanıcı adı / hesap ve bağlantı havuzundan geçer (kullanımı oldukça izlenir ve önerilmez).
- Oracle gibi sistemlerde, sen LDAP erişim elde edebilir veya harici veritabanlarına sembolik oluşturmak (vpn üzerinden bir iş ortağının db üzerinde bir mağaza proc çağırarak söylüyorlar.) Spagetti kod yapmak kolay yolu, ama hepsi programlama paradigmaları için doğru ve bazen Bunun için tek çözüm olan belirli iş / çevre gereksinimleriniz var. Mağaza işlemleri, bu boşluğu tek bir yerde, verilere yakın ve uygulama sunucusuna geçmek zorunda kalmadan kapsüllemeye yardımcı olur.
Bunu db'de mağaza protası olarak mı yoksa uygulama sunucunuzda mı çalıştırdığınız, mühendis olarak yapmanız gereken takas analizine bağlıdır. Her iki seçenek de analiz edilmeli ve bir çeşit analizle gerekçelendirilmelidir. Diğer alternatifi "kötü uygulama" olarak suçlayarak bir yoldan diğerine gitmek, bu sadece bir topal mühendisliği kopyasıdır.
- Uygulama sunucunuzu kolayca ölçekleyemediğiniz durumlarda (.ie. Yeni donanım veya bulut örnekleri için bütçe yoktur), ancak db arka ucunda çok fazla kapasite varsa (bu, birçok kişinin kabul etmek istediği daha tipik) iş mantığını procs depolamak için hareket ettirmek. Güzel değil ve anemik etki alanı modellerine yol açabilir ... ama sonra tekrar ... takas analizi, çoğu yazılımın emdiği şey.
Bunun kalıcı bir çözüm haline gelip gelmediği, o anda gözlenen kısıtlamalara özgüdür.
Umarım yardımcı olur.