SQL'i Depolanmış Proc'larda Kod karşısında tutmak için artıları ve eksileri nelerdir?


274

SQL'i C # kaynak kodunuzda veya Kayıtlı Proc'larda tutmanın avantajları / dezavantajları nelerdir? Bunu üzerinde çalıştığımız açık kaynak kodlu bir projede bir arkadaşımla tartışıyorum (C # ASP.NET Forum). Şu anda, veritabanı erişiminin çoğu, C # içinde SQL satır içi oluşturularak ve SQL Server DB çağrılarak yapılır. Bu yüzden, bu proje için hangisinin daha iyi olacağını belirlemeye çalışıyorum.

Şimdiye kadar var:

Koddaki Avantajlar:

  • Bakımı daha kolaydır - sorguları güncellemek için bir SQL komut dosyası çalıştırmanıza gerek yoktur
  • Başka bir DB'ye daha kolay bağlantı - bağlantı noktasına proces yok

Kayıtlı Proseslerin Avantajları:

  • Verim
  • Güvenlik

50
Saklanan Procs'un bakımı kolaylaştırdığını da iddia edebilirsiniz - sadece bir sorguyu değiştirmek için tüm uygulamayı yeniden dağıtmanız gerekmez.
Darren Gosbell

27
@GvS: Bu şirketinizin bir işlev bozukluğu, en iyi uygulama değil. Tabii ki işleri 1000 yerine 1 yerde değiştirmek daha kolaydır. DBA'lar sistemde daha cavalier değişikliklerini önlemek için üzerlerine düşeni yapıyorlar ve buna saygı duyulmalıdır.
Jeremy Holovacs

Yanıtlar:


179

Saklı yordamların hayranı değilim

Saklı Yordamlar DAHA FAZLA sürdürülebilir çünkü: * Bazı SQL'leri değiştirmek istediğinizde C # uygulamanızı yeniden derlemeniz gerekmez

Veri türleri değiştiğinde yeniden derlemeye başlayacaksınız ya da fazladan bir sütun ya da başka bir şey döndürmek isteyeceksiniz. SQL'i uygulamanızın altından 'şeffaf bir şekilde' değiştirme sayısı genel olarak oldukça azdır

  • Sonunda SQL kodunu yeniden kullanırsınız.

Programlama dilleri, C # dahil, bir fonksiyon denilen bu şaşırtıcı şey var. Bu, aynı kod bloğunu birden fazla yerden çağırabileceğiniz anlamına gelir! İnanılmaz! Daha sonra, yeniden kullanılabilir SQL kodunu bunlardan birinin içine koyabilirsiniz veya gerçekten yüksek teknoloji almak istiyorsanız, bunu sizin için yapan bir kitaplık kullanabilirsiniz. Onların Nesne İlişkisel Haritacıları olarak adlandırıldıklarına inanıyorum ve bu günlerde oldukça yaygın.

Kod tekrarı, sürdürülebilir bir uygulama oluşturmaya çalışırken yapabileceğiniz en kötü şeydir!

Anlaşılan, bu yüzden saklanan prosedürler kötü bir şeydir. Kodları işlevlere dönüştürmek ve (daha küçük parçalara bölmek) SQL'e dönüştürmek çok daha kolay ... SQL bloklarına?

Aynı SQL kodunu kullanan 4 web sunucunuz ve bir grup windows uygulamanız var. Şimdi SQl kodunda küçük bir sorun olduğunu fark ettiniz, bu yüzden daha ziyade ... web sunucuları, tüm masaüstü uygulamalarını yeniden yükleyin (clickonce yardımcı olabilir) tüm Windows kutularına

Windows uygulamalarınız neden doğrudan merkezi bir veritabanına bağlanıyor? Bu, orada büyük bir güvenlik deliği gibi görünüyor ve sunucu tarafı önbellekleme kural olarak darboğaz. Bir web hizmeti aracılığıyla veya web sunucularınıza benzer bir şekilde bağlanmıyorlar mı?

Peki, 1 yeni sproc mu yoksa 4 yeni web sunucusu mu?

Bu durumda , yeni bir sproc itmek daha kolaydır, ancak benim deneyimime göre, 'itilen değişikliklerin'% 95'i kodu değil veritabanını etkiler. O ay web sunucularına 20, veritabanına 1 şey gönderiyorsanız, web sunucularına 21 ve veritabanına sıfır koyarsanız çok fazla kaybedersiniz.

Daha kolay kod gözden geçirildi.

Nasıl olduğunu açıklayabilir misin? Bunu anlamıyorum. Özellikle sprocs olarak görülmesi muhtemelen kaynak kontrolünde değildir ve bu nedenle web tabanlı SCM tarayıcıları vb. Üzerinden erişilemez.

Daha fazla eksileri:

Storedprocs, dış dünyaya bir kara kutu olarak görünen veritabanında yaşar. Onları kaynak kontrolüne sokmak gibi basit şeyler bir kabus haline gelir.

Ayrıca büyük bir çaba meselesi var. CEO'nuza bazı forumlar inşa etmenin neden sadece 7 milyon dolara mal olduğunu, ancak aksi takdirde her küçük şey için bir depolanmış proc oluşturmak, sadece hiçbir şey için ekstra eşek işi olduğunu kanıtlamak istiyorsanız, her şeyi bir milyon katmana ayırmak mantıklı olabilir. yarar.


99

Bu, şu anda burada birkaç konu üzerinde tartışılmaktadır. Ben saklı yordamlar tutarlı bir savunucusu, Linq to Sql için bazı iyi argümanlar sunulmasına rağmen.

Sorguları kodunuza gömmek sizi veri modelinize sıkıca bağlar. Saklı yordamlar iyi bir sözleşmeli programlama biçimidir, yani bir DBA, saklı yordamın girdi ve çıktıları tarafından temsil edilen sözleşme muhafaza edildiği sürece, veri modelini ve yordamdaki kodu değiştirme özgürlüğüne sahiptir.

Üretim veritabanlarının ayarlanması, sorgular kodun içine gömüldüğünde ve merkezi ve yönetilmesi kolay bir yerde değilken son derece zor olabilir.

İşte başka bir güncel tartışma


47

Bence bu soruya evet ya da hayır oyu veremezsiniz. Bu tamamen uygulamanızın tasarımına bağlıdır.

Önünde bir uygulama sunucunuzun bulunduğu 3 katmanlı bir ortamda SP'lerin kullanımına karşı tamamen oy kullanıyorum. Bu tür bir ortamda, uygulama sunucunuz iş mantığınızı çalıştırmak için oradadır. SP'leri ek olarak kullanırsanız, iş mantığı uygulamanızı sisteminizin her yerine dağıtmaya başlarsınız ve kimden neyin sorumlu olduğu çok netleşir. Sonunda temelde aşağıdakilerden başka bir şey yapmayacak bir uygulama sunucusu ile sonuçlanacaksınız:

(Pseudocode)

Function createOrder(Order yourOrder) 
Begin
  Call SP_createOrder(yourOrder)
End

Sonuçta her biri 16 CPU ile donatılmış bu çok serin 4 Sunucu kümesinde orta katmanınız var ve aslında hiçbir şey yapmayacak! Ne gereksiz!

Doğrudan DB'nize veya belki de daha fazla uygulamaya bağlanan bir yağ gui istemciniz varsa, bu farklı bir hikaye. Bu durumda SP'ler, uygulamanızı veri modelinden ayıran ve kontrol edilebilir bir erişim sunan bir tür sahte orta katman olarak hizmet edebilir.


44

Koddaki Avantajlar:

  • Bakımı daha kolaydır - sorguları güncellemek için bir SQL komut dosyası çalıştırmanıza gerek yoktur
  • Başka bir DB'ye daha kolay bağlantı - bağlantı noktasına proces yok

Aslında, bunun geriye doğru olduğunu düşünüyorum. IMHO, SQL kodunu korumak acıdır çünkü:

  • kendinizi ilgili kod bloklarında tekrar edersiniz
  • SQL birçok IDE'de dil olarak desteklenmediğinden, sizin için görevleri yerine getiren bir dizi hata kontrol edilmemiş dizeye sahipsiniz
  • veri türü, tablo adı veya kısıtlamasındaki değişiklikler, tüm veritabanlarını yenileriyle değiştirmekten çok daha yaygındır
  • sorgunuz karmaşıklaştıkça zorluk düzeyiniz artar
  • ve satır içi sorguyu test etmek için projenin oluşturulması gerekir

Saklanan Procs'u veritabanı nesnesinden çağırdığınız yöntemler olarak düşünün - yeniden kullanmak çok daha kolaydır, düzenlemek için tek bir yer vardır ve DB sağlayıcılarını değiştirmeniz durumunda değişiklikler Kodunuzda değil Saklanan Protokollerinizde gerçekleşir .

Bununla birlikte, depolanan procların performans kazançları Stu'nun benden önce söylediği gibi minimumdur ve saklı bir prosedüre bir kırılma noktası koyamazsınız (henüz).


33

CON

Saklı yordamlar içinde çok fazla işlem yapmanın, eyleminizi ölçeklendirme söz konusu olduğunda DB sunucunuzu tek bir esneklik noktası haline getireceğini düşünüyorum.

Ancak sql sunucusu sayfaları değil, programda çatırdayan, hepsi yapıyor olabilir daha kodunuzu çalışan birden çok sunucu varsa ölçeklemenize olanak tanır. Tabii ki bu, yalnızca normal getirme veya güncelleme yapan saklı procs için değil, veri kümeleri üzerinde döngü gibi daha fazla işlem gerçekleştirenler için geçerli değildir.

Artıları

  1. Değer için performans (DB sürücüsü / plan rekreasyon vb. Tarafından sorgu ayrıştırmasını önler)
  2. Veri işleme C / C ++ / C # koduna gömülü değil, bu da bakacak daha az seviye kodum olduğu anlamına geliyor. SQL, daha az ayrıntılıdır ve ayrı olarak listelendiğinde daha kolay incelenebilir.
  3. Ayrılma nedeniyle millet SQL kodunu bulmak ve yeniden kullanmak çok daha kolay.
  4. Şema değiştiğinde bir şeyleri değiştirmek daha kolaydır - koda aynı çıktıyı vermeniz yeterlidir ve iyi çalışır
  5. Farklı bir veritabanına kolayca taşınabilir.
  6. Saklı yordamlarımdaki bireysel izinleri listeleyebilir ve bu düzeydeki erişimi de denetleyebilirim.
  7. Veri dönüştürme kodumdan ayrı olarak veri sorgumu / kalıcılık kodumu profili oluşturabilirim.
  8. Saklı yordamda değiştirilebilir koşullar uygulayabilirim ve bir müşteri sitesinde özelleştirmek kolay olurdu.
  9. Şemalarımı ve ifadelerimi bir araya getirmek için bazı otomatik araçları kullanmak daha kolay hale gelir.
  10. Tüm veri erişim kodunuzu tek bir dosyada bulduğunuzda veri erişimi için en iyi uygulamaları sağlamak daha kolaydır - Performans tablosu olmayan veya daha yüksek düzeyde serileştirme kullanan veya kodda * 'ları seçen sorguları kontrol edebilirim. .
  11. Tümü tek bir dosyada listelendiğinde şema değişikliklerini / veri işleme mantık değişikliklerini bulmak daha kolay hale gelir.
  12. Aynı yerde bulundukları zaman SQL'de düzenlemeleri aramak ve değiştirmek daha kolay hale gelir, örneğin saklanan tüm procs için işlem yalıtım deyimlerini değiştirin / ekleyin.
  13. Ben ve DBA adam DBA benim SQL şeyler gözden geçirmek zorunda olduğunda ayrı bir SQL dosyası olması daha kolay / rahat olduğunu bulmak.
  14. Son olarak, SQL enjeksiyon saldırıları hakkında endişelenmenize gerek yok çünkü ekibinizin bazı tembel üyeleri gömülü sqls kullanırken parametreli sorgular kullanmadı.

22

Saklı yordamlar için performans avantajı genellikle önemsizdir.

Saklı yordamlar için daha fazla avantaj:

  • Tersine mühendisliği önleyin (elbette Şifreleme ile oluşturulmuşsa)
  • Veritabanı erişiminin daha iyi merkezileştirilmesi
  • Veri modelini şeffaf bir şekilde değiştirme yeteneği (yeni istemcileri dağıtmak zorunda kalmadan); özellikle birden fazla program aynı veri modeline erişiyorsa kullanışlıdır

16

Kod tarafına düşüyorum . Tüm uygulamalar (hem web hem de istemci) tarafından kullanılan veri erişim katmanı oluşturuyoruz, bu yüzden bu açıdan KURU. Yalnızca veritabanı şemalarının doğru olduğundan emin olmamız gerektiğinden veritabanı dağıtımını basitleştirir. Kaynak koduna ve veritabanına bakmamız gerekmediğinden kod bakımını basitleştirir.

Veri modeli ile sıkı bağlantı ile pek bir sorunum yok çünkü o kuplajı gerçekten kırmanın nerede mümkün olduğunu görmüyorum. Bir uygulama ve verileri doğal olarak birleştirilir.


13

Saklı yordamlar.

Bir hata kaybolursa veya mantık biraz değişirse, projeyi yeniden derlemenize gerek yoktur. Ayrıca, yalnızca projenizdeki sorguyu kodladığınız yer değil, farklı kaynaklardan erişime izin verir.

Saklı yordamları korumak için daha zor olduğunu düşünmüyorum, onları doğrudan veritabanında değil, ayrı dosyalarda kodlamanız gerekir, o zaman sadece kurmanız gereken DB üzerinde çalıştırabilirsiniz.


24
Kodunuzu yeniden derlemekten kaçınmak için temel mimari kararlar verirseniz, hiç bir şey yapmadan önce, tamamen emmeyen bir inşa süreci oluşturun. Bu bir argüman değil.
Michael Borgwardt

13

Saklı yordamlar için avantajlar :

Daha kolay kod gözden geçirildi.

Daha az bağlanır, bu nedenle daha kolay test edilir.

Daha kolay ayarlanabilir.

Ağ trafiği açısından performans genellikle daha iyidir - bir imleciniz veya benzeriniz varsa, veritabanına birden fazla yolculuk olmaz

Verilere erişimi daha kolay koruyabilir, tablolara doğrudan erişimi kaldırabilir, procs aracılığıyla güvenliği zorlayabilirsiniz - bu aynı zamanda bir tabloyu güncelleyen tüm kodları nispeten hızlı bir şekilde bulmanızı sağlar.

İlgili başka hizmetler varsa (Raporlama hizmetleri gibi), tüm mantığınızı kod yerine depolanmış bir yordamda depolamak ve çoğaltmak zorunda kalmaktan daha kolay olabilir

Dezavantajları:

Geliştiriciler için yönetilmesi daha zor: komut dosyalarının sürüm kontrolü: Herkesin kendi veritabanı var mı, sürüm kontrol sistemi veritabanı ve IDE ile entegre mi?


Evet, Visual Studio 2012 veritabanı projesinde ve tfs'de Saklı yordamlar ve veritabanında sürüm denetimi yapabilirsiniz.
hajirazin

11

Bazı durumlarda, dinamik olarak kodda oluşturulan sql, saklanan bir işlemden daha iyi performans gösterebilir. Çok esnek olması gerektiğinden düzinelerce parametre ile son derece karmaşık hale gelen depolanmış bir proc (diyelim ki sp_customersearch) oluşturduysanız, muhtemelen çalışma zamanında kodda çok daha basit bir sql ifadesi oluşturabilirsiniz.

Bunun SQL'den web sunucusuna bazı işlemleri basitçe taşıdığı iddia edilebilir, ancak genel olarak bu iyi bir şey olacaktır.

Bu teknikle ilgili diğer harika şey, SQL profiler'e baktığınızda, oluşturduğunuz sorguyu görebiliyor ve hata ayıklamak, 20 parametreli depolanmış bir proc çağrısını görmekten çok daha kolay.


1
Bu cevabın neden oylandığından emin değilim. Bu, SQL Server ekibi tarafından bile yorumlandı.
Brannon

9

Saklı procs seviyorum, uygulama için herhangi bir kesinti üretmedi saklı bir yordam kullanarak bir uygulamada kaç kez değişiklik yapabildi bilmiyorum.

Transact SQL'in büyük hayranı, büyük sorguları ayarlamanın benim için çok yararlı olduğu kanıtlandı. Yaklaşık 6 yıldır hiçbir satır içi SQL yazmadım!



8

Sprocs için 2 pro-puan listeliyorsunuz:

Performans - pek değil. Sql 2000 veya daha üst sürümlerinde sorgu planı optimizasyonları oldukça iyi ve önbelleğe alınmıştır. Oracle vb benzer şeyler yapmak eminim. Artık performans için sprocs için bir durum olduğunu düşünmüyorum.

Güvenlik? Sproks neden daha güvenli olur? Zaten güvenli olmayan bir veritabanınız yoksa, tüm erişim DBA'larınızdan veya uygulamanız üzerinden olacaktır. Her zaman tüm sorguları parametreleştirin - asla kullanıcı girdisinden bir şey satır içi yapmayın ve iyi olacaksınız.

Yine de performans için en iyi uygulama budur.

Linq kesinlikle şu an yeni bir projeye devam etmemin yolu. Bu benzer gönderiye bakın .


Geçici SQL yürütme planları yalnızca belirli durumlarda yeniden kullanılır: tinyurl.com/6x5lmd [Kod kanıtı ile SO yanıtı] SQL için LINQ resmen öldü: tinyurl.com/6298nd [blog yazısı]
HTTP 410

1
Procs açık ara en güvenli yol. Kullanıcının yalnızca işlemlerde işlem yapmasını sınırlarlar. Doğrudan bir tabloya gidemezler veya yazma erişimine sahip oldukları ve bir şeyleri değiştirebilecekleri görünümleri görüntüleyemezler. İç tehditlerden kaynaklanan zararı önlemek için procs gereklidir.
HLGEM

8

@Keith

Güvenlik? Sproks neden daha güvenli olur?

Komradekatz tarafından önerildiği gibi, tablolara (DB'ye bağlanan kullanıcı adı / şifre kombinasyonu için) erişime izin vermeyebilir ve yalnızca SP erişimine izin verebilirsiniz. Bu şekilde, birisi kullanıcı adını ve şifreyi veritabanınıza alırsa SP'leri yürütebilir, ancak tablolara veya DB'nin başka bir bölümüne erişemez.

(Tabii ki sprocs yürütmek onlara ihtiyaç duydukları tüm verileri verebilir, ancak bu mevcut sprocs bağlıdır. Tablolara erişim vermek onlara her şeye erişim sağlar.)


1
@Joe Philllips, görüşler size procs için daha iyi ve hatta eşit güvenlik sağlamaz ve sahtekarlığı veya dahili zararları önlemede YARARLANMAZ. Procs kullandığınızda, güvenlik modeli, kullanıcıların yalnızca tablolara veya görünümlere değil proc'a erişebilmeleri ve böylece bir proc'un yaptıkları dışında hiçbir şey yapamamasıdır. Finansal verileriniz varsa ve procs kullanmıyorsanız, sisteminiz risk altındadır.
HLGEM

7

Bu şekilde düşün

Aynı SQL kodunu kullanan 4 web sunucunuz ve bir grup windows uygulamanız var. Şimdi SQl kodunda küçük bir sorun olduğunu fark ettiniz, bu yüzden daha ziyade ... web sunucuları, tüm masaüstü uygulamalarını yeniden yükleyin (clickonce yardımcı olabilir) tüm Windows kutularına

Depolanmış procları tercih ederim

Ayrıca bir proc'a karşı performans testi yapmak, set showplan_text on ve voila'da sorgu analizörü set istatistiklerini io / zamanına koymak daha kolaydır

tam olarak ne denildiğini görmek için profil oluşturmaya gerek yok

sadece 2 sentim


6

Onları kod içinde tutmak için tercih ederim (bir ORM kullanarak, satır içi veya ad-hoc değil), bu yüzden .sql dosyalarını kaydetme ile uğraşmak zorunda kalmadan kaynak denetimi tarafından kapsanırlar.

Ayrıca, saklı yordamlar doğal olarak daha güvenli değildir. Satır içi kadar kolay bir sproc ile kötü bir sorgu yazabilirsiniz. Parametreli satır içi sorgular bir sproc kadar güvenli olabilir.


6

Uygulama kodunuzu en iyi yaptığı şekilde kullanın: mantığı kullanın.
Veritabanınızı en iyi yaptığı şey için kullanın: veri depolayın.

Saklı yordamlarda hata ayıklama yapabilirsiniz, ancak kodda hata ayıklama ve bakım mantığı daha kolay bulacaksınız. Genellikle, veritabanı modelini her değiştirdiğinizde kodunuzu yeniden derlemeye son verirsiniz.

Ayrıca isteğe bağlı arama parametreleri ile saklı yordamlar çok yetersizdir, çünkü önceden olası tüm parametreleri belirtmeniz gerekir ve karmaşık aramalar bazen mümkün değildir, çünkü bir parametrenin aramada kaç kez tekrarlanacağını tahmin edemezsiniz.


2
Birden fazla uygulama aynı veritabanına çarptığında ve veritabanları içe aktarma ve diğer doğrudan erişimden etkilendiğinde (tüm fiyatları% 10 oranında güncelleyin), mantık veritabanında olmalı veya veritabanı bütünlüğünü kaybedersiniz.
HLGEM

Birden çok uygulama için, mantığı tüm uygulamalar tarafından kullanılan bir kitaplığa yerleştirmek, mantığı uygulama dilinde tutarken bütünlüğün korunmasına olanak tanır. İthalat / doğrudan erişim için, genellikle uygulamalara uygulanan kuralların uygulanıp uygulanmayacağı durumsaldır.
Dave Sherohman

3
birden çok uygulama veritabanında aynı türde değişiklikler yapmamalıdır. tek bir tür değişiklikle ilgilenen bir uygulama bileşeni olmalıdır. Sonra diğerleri ilgilenen bu uygulama bir hizmet ortaya koymalıdır. Aynı veritabanını / tabloyu uygun gördükleri şekilde değiştiren birden fazla uygulama, bir uygulama sistemi ve veritabanının sürdürülemez olmasına neden olan şeydir.
Jiho Han

2
"Tek bir tür değişiklikle ilgilenen tek bir uygulama bileşeni olmalıdır" - Bu bileşen, örneğin PL / SQL'de depolanmış bir prosedür olabilir.
RussellH

6

Güvenlik söz konusu olduğunda, saklı yordamlar çok daha güvenlidir. Bazıları tüm erişimin yine de uygulama üzerinden olacağını savunuyor. Birçok insanın unuttuğu şey, güvenlik ihlallerinin çoğunun bir şirketten gelmesidir. Kaç geliştiricinin uygulamanızın "gizli" kullanıcı adını ve şifresini bildiğini düşünün.

Ayrıca, MatthieuF'un belirttiği gibi, uygulama (masaüstü veya web sunucusunda olsun) ve veritabanı sunucusu arasında daha az gidiş dönüş nedeniyle performans çok daha iyi olabilir.

Deneyimlerime göre, veri modelinin saklı yordamlarla soyutlanması da sürdürülebilirliği büyük ölçüde geliştirmektedir. Geçmişte birçok veritabanını korumak zorunda olan biri olarak, saklanan bir prosedürü veya ikisini kolayca değiştirmek ve değişikliğin TÜM dış uygulamalar için tamamen şeffaf olması, gerekli bir model değişikliği ile karşı karşıya kaldığında böyle bir rahatlamadır. Çoğu zaman uygulamanız bir veritabanına işaret eden tek kişi değildir - başka uygulamalar, raporlama çözümleri vb. Vardır.

Ayrıca SQL programlamasını uzmanlaşanların ellerine koymak için artı sütuna kontroller koyacağım ve SP'ler için kodu izole etmeyi ve test etmeyi / optimize etmeyi çok daha kolay hale getireceğim.

Gördüğüm tek dezavantajı, birçok dilin tablo parametrelerinin geçirilmesine izin vermemesi, bu nedenle bilinmeyen bir sayı veri değerinin iletilmesi can sıkıcı olabilir ve bazı diller hala tek bir saklı yordamdan birden çok sonuç kümesi almayı başaramaz ( ikincisi SP'leri bu açıdan satır içi SQL'den daha kötü yapmaz).


Model değiştiğinde, kodun sprocs veya dinamik sql kullanmasına bakılmaksızın genellikle kodun değiştirilmesi gerekir. Ve tablo / şema oluşturduktan sonra sadece tablo / şemayı ne sıklıkta değiştirirsiniz? Sık değil. Genellikle değişiklikler başka bir sütun veya başka bir tablo eklemeniz gereken iş gelir, bu durumda, bir kod değişikliği olmadan yapabileceğinizden şüpheliyim.
Jiho Han

4

Depolanan procs üzerinden tüm çağrıları yapmak ve doğrudan tablolara erişimi reddetmek için katıldığım bir Microsoft TechEd oturumunun önerilerinden biri. Bu yaklaşım ek güvenlik sağlamak olarak faturalandırıldı. Sadece güvenlik için buna değip değmeyeceğinden emin değilim, ancak zaten kayıtlı procları kullanıyorsanız, zarar veremedi.


Veri güvenliği, özellikle kişisel bilgiler veya finansal bilgilerle uğraşırken önemlidir. Sahtekarlıkların çoğu içeriden öğrenenler tarafından yapılır. Dahili denetimleri atlamak için onlara gereken erişimi vermek istemezsiniz.
HLGEM

4

Saklı bir prosedüre koyarsanız, bakımı kesinlikle daha kolaydır. Gelecekte potansiyel olarak değişecek zor bir mantık varsa, bağlanan birden fazla istemciniz olduğunda veritabanına koymak kesinlikle iyi bir fikirdir. Örneğin, şu anda her ikisi de bir veritabanını paylaşan bir son kullanıcı web arayüzü ve bir yönetici masaüstü uygulaması olan bir uygulama üzerinde çalışıyorum ve veritabanında mümkün olduğunca çok mantık tutmaya çalışıyorum. Bu KURU ilkesinin mükemmel bir örneğidir .


4

Ben saklı proc dinamik hile kullanmak ve hile yok varsayalım depolanmış procs tarafında sıkıca duyuyorum. İlk olarak, saklanan procs'ları kullanmak dba'nın izinleri tablo düzeyinde değil, saklı proc düzeyinde ayarlamasına izin verir. Bu sadece SQL enjeksiyon temaslarıyla savaşmak için değil, aynı zamanda içeriden gelenlerin veritabanına doğrudan erişmesini ve bazı şeyleri değiştirmesini önlemede kritik öneme sahiptir. Bu, sahtekarlığı önlemenin bir yoludur. Kişisel bilgiler içeren (SSN'ler, Kredi kartı numaraları, vb.) Veya yine de finansal işlemler oluşturan hiçbir veritabanına, düzenli prosedürler dışında erişilmemelidir. Başka bir yöntem kullanırsanız, sahte finansal işlemler oluşturmak veya kimlik hırsızlığı için kullanılabilecek verileri çalmak için veritabanınızı şirketteki bireylere açık bırakırsınız.

Saklanan procs'un bakımı ve performans ayarı da uygulamadan gönderilen SQL'den çok daha kolaydır. Ayrıca, dba'ya, bir veritabanı yapısal değişikliğinin verilere erişme yolu üzerindeki etkisini görmenin bir yolunu sağlar. Veritabanına dinamik erişime izin verecek iyi bir dba ile hiç karşılaşmadım.


4

Şu anda çalıştığım Oracle DB'lerde saklı yordamlar kullanıyoruz. Subversion da kullanıyoruz. Saklanan tüm yordamlar .pkb & .pks dosyaları olarak oluşturulur ve Subversion'a kaydedilir. Daha önce satır içi SQL yaptım ve bu bir acı! Burada yapmayı çok tercih ederim. Yeni saklı yordamlar oluşturmak ve test etmek, kodunuzda yapmaktan çok daha kolaydır.

Orada bir


3

Daha küçük günlükler

Saklı yordamlar için bahsedilmeyen başka bir küçük profesyonel: SQL trafiği söz konusu olduğunda, sp tabanlı veri erişimi çok daha az trafik üretir . Analiz ve profil oluşturma için trafiği izlediğinizde bu önemli hale gelir - günlükler çok daha küçük ve okunabilir olacaktır.


3

Saklı yordamların büyük bir hayranı değilim, ama onları tek bir koşulda kullanıyorum:

Sorgu oldukça büyük olduğunda, koddan göndermek yerine veritabanında saklı yordam olarak saklamak daha iyidir. Bu şekilde, uygulama sunucusundan veritabanına çok sayıda dize karakteri göndermek yerine, yalnızca "EXEC SPNAME"komut gönderilir.

Veritabanı sunucusu ve web sunucusu aynı ağda olmadığında aşırı yüklenir (Örneğin, internet iletişimi). Ve durum böyle olmasa bile, çok fazla stres çok fazla boşa giden bant genişliği anlamına gelir.

Ama dostum, yönetmeleri çok korkunç. Onlardan olabildiğince kaçınırım.


3

SQL'de saklanan bir proc, sorgunun performansını artırmaz


Nasıl olamaz? Lütfen bunu açıklayınız.
Sandesh

SQL sorgusu derlenebilirse performansı artıracaktır.
TT.

3

Saklı yordamlar kullanmanın kod içinde SQL oluşturmaya göre birçok avantajı vardır.

  1. Kod uygulamanız ve SQL'iniz birbirinden bağımsız hale gelir.
  2. Kodun okunması daha kolaydır.
  3. Bir kez yazın birçok kez kullanın.
  4. Bir kez değiştir
  5. Veritabanı hakkında programcıya içsel detaylar vermeye gerek yoktur. vs vs.

Bir kod sorunu veya yeni özellik hakkında daha az bilgi sahibi olmanın benim için yararlı olduğu bir durumda hiç bulunmadım, 5 sayısını açıklığa kavuşturabilir misiniz?
Mart'ta

2

Saklı Yordamlar DAHA FAZLA bakımı yapılabilir çünkü:

  • Bazı SQL'leri değiştirmek istediğinizde C # uygulamanızı yeniden derlemenize gerek yoktur
  • Sonunda SQL kodunu yeniden kullanırsınız.

Kod tekrarı, sürdürülebilir bir uygulama oluşturmaya çalışırken yapabileceğiniz en kötü şeydir!

Birden fazla yerde düzeltilmesi gereken bir mantık hatası bulduğunuzda ne olur? Kodunuzu kopyalayıp yapıştırdığınız son noktayı değiştirmeyi unutabilirsiniz.

Bence, performans ve güvenlik kazanımları artı bir artı. Yine de güvenli olmayan / verimsiz SQL saklı yordamları yazabilirsiniz.

Başka bir DB'ye daha kolay bağlantı - bağlantı noktasına proces yok

Başka bir DB'de oluşturmak için tüm saklı yordamlarınızı komut dosyası oluşturmak çok zor değil. Aslında - endişelenecek birincil / yabancı anahtarlar olmadığından tablolarınızı dışa aktarmaktan daha kolaydır .


Sadece bir not: "Başka bir DB'ye daha kolay bağlantı - hiçbir bağlantı noktasına procs yok" ifadesi , sadece başka bir kurulum için değil, başka bir DBMS'ye aktarma anlamına gelir . Orada alternatifler var, bilirsiniz ;-).
sleske

2

@ Terrapin - sprocs, enjeksiyon saldırılarına karşı savunmasızdır. Söylediğim gibi:

Her zaman tüm sorguları parametreleştirin - asla kullanıcı girdisinden bir şey satır içi yapmayın ve iyi olacaksınız.

Bu sprocs ve dinamik Sql için geçerlidir.

Uygulamanızı yeniden derlememenin bir avantaj olduğundan emin değilim. Yani, yine de canlı yayına geçmeden önce birim kodlarınızı bu koda (hem uygulama hem de DB) karşı çalıştırdınız.


@Guy - evet haklısınız, sprocs uygulama kullanıcılarını kontrol etmenize izin verir, böylece temel eylemi değil, sadece sproc gerçekleştirebilirler.

Benim sorum şu olurdu: Uygulamanız üzerinden tüm erişim, güncelleme / ekleme vb. İçin sınırlı haklara sahip bağlantılar ve kullanıcılar kullanarak, bu ekstra seviye güvenlik veya ekstra yönetim ekliyor mu?

Benim düşüncem çok ikincisidir. Başvurunuzu yeniden yazabilecekleri noktaya düşürdüler, kullanabilecekleri başka saldırılar da vardır.

Sql enjeksiyonları, dinamik olarak satır içi kodları varsa, bu sprocs'a karşı hala yapılabilir, bu nedenle altın kural hala geçerlidir, tüm kullanıcı girdileri her zaman parametrelenmelidir.


Sadece savaşmanız gereken atacks dışında değil. Daha sonra sahtekarlık yapmak için verileri değiştirebilecek kullanıcılara tablolara doğrudan erişime izin veremezsiniz.
HLGEM

Bir ilke olarak, depolanan proc'ların dinamik sql kullanmasına izin verilmemelidir, bakarsanız neredeyse her zaman dinamik olmayan bir çözüm vardır.
HLGEM

Dinamik yerleştirme koduna sahip sproclara karşı SQL enjeksiyonu o kadar etkili değildir, çünkü dinamik kod arayan izniyle değil, statik izniyle çalışır. Bu SQL Server için geçerlidir - Oracle hakkında emin değilim.
HTTP 410

2

Şimdiye kadar görmediğim bir şey: veritabanını en iyi bilen insanlar her zaman uygulama kodunu yazan insanlar değildir. Saklı yordamlar veritabanı insanlarına gerçekten SQL hakkında çok fazla şey öğrenmek istemeyen programcılar ile arayüz oluşturmak için bir yol sağlar. Büyük - ve özellikle eski - veritabanları tamamen anlaşılması en kolay şeyler değildir, bu nedenle programcılar onlara ihtiyaç duydukları şeyleri veren basit bir arayüzü tercih edebilirler: DBA'ların bunu yapmak için 17 masaya nasıl katılacağını anlamasına izin verin.

Bununla birlikte, saklı yordamları yazmak için kullanılan diller (PL / SQL kötü şöhretli bir örnektir) oldukça acımasızdır. Genellikle günümüzün popüler zorunlulukları, OOP veya işlevsel dillerinde gördüğünüz incelikleri sunmazlar. COBOL'u düşünün.

Bu nedenle, iş mantığı içerenlerden ziyade yalnızca ilişkisel ayrıntıları soyutlayan saklı yordamlara sadık kalın.


"Saklı yordamları yazmak için kullanılan diller (PL / SQL kötü şöhretli bir örnektir) oldukça acımasızdır [ve] bugünün popüler dillerinde gördüğünüz inceliklerin hiçbirini sunmamaktadır." PL / SQL belgelerini yeniden okumalısınız ( download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/toc.htm ). PL / SQL paketleri kullanarak kapsülleme, nesne türleri üzerinden OOP, istisna yönetimi, kodun dinamik yürütülmesi, hata ayıklayıcılar, profilleyiciler vb. İle HTTP çağrılarından şifrelemeye ve düzenli ifadelere kadar her şeyi yapmak için yüzlerce standart, Oracle tarafından sağlanan paket / kütüphane . PL / SQL çok sayıda güzelliğe sahiptir.
ObiWanKenobi

2

Genellikle OO kodunu yazarım. Çoğunuzun da muhtemelen olduğundan şüpheleniyorum. Bu bağlamda, SQL sorguları da dahil olmak üzere tüm iş mantığının sınıf tanımlarına ait olduğu açıktır. Mantığı, bir kısmı nesne modelinde kalacak ve bir kısmı veritabanında olacak şekilde bölmek, iş mantığını kullanıcı arayüzüne koymaktan daha iyi değildir.

Daha önceki yanıtlarda depolanan proc'ların güvenlik yararları hakkında çok şey söylendi. Bunlar iki geniş kategoriye ayrılır:

1) Verilere doğrudan erişimi kısıtlama. Bu kesinlikle bazı durumlarda önemlidir ve biriyle karşılaştığınızda depolanan procs neredeyse tek seçeneğinizdir. Benim tecrübelerime göre, bu gibi durumlar kuraldan ziyade istisnadır.

2) SQL enjeksiyonu / parametreli sorgular. Bu itiraz kırmızı bir ringa balığıdır. Inline SQL - dinamik olarak üretilen inline SQL bile - herhangi bir saklı proc kadar tam olarak parametrelendirilebilir ve tuzuna değer herhangi bir modern dilde kolayca yapılabilir. Burada her iki şekilde de bir avantaj yok. ("Tembel geliştiriciler parametreleri kullanmakla uğraşmayabilir" geçerli bir itiraz değildir. Ekibinizde, kullanıcı verilerini parametreleri kullanmak yerine SQL'lerine birleştirmeyi tercih eden geliştiricileriniz varsa, önce bunları eğitmeye çalışırsınız, sonra bunları tetiklersiniz bu işe yaramazsa, tıpkı başka kötü, açıkça zararlı bir alışkanlığa sahip geliştiricilerle olduğu gibi.)


2

SPROC en büyük kod destekçisiyim. Bir numaralı neden, kodu sıkıca bağlı tutmaktır, daha sonra yakın bir saniye, onu çekmek için çok fazla özel yardımcı program olmadan kaynak kontrol kolaylığıdır.

Çok karmaşık SQL deyimlerimiz varsa DAL'mizde, bunları genellikle kaynak dosyaları olarak ekler ve gerektiğinde güncelleriz (bu da ayrı bir derleme olabilir ve db, vb. Başına değiştirilebilir).

Bu, kodumuzu ve sql çağrılarımızı güncelleme için bazı harici uygulamaları çalıştırmayı "unutmadan" aynı sürüm kontrolünde saklar.


Tablolardaki değişiklikleri çoğaltmayı "unutursanız" ne olur?
craigmoliver

İşlem dağıtım sorunlarını çözebilir.
Tom Anderson
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.