Kullanılacak diğer veritabanlarında dahili olarak saklanan procs için merkezi bir CLR saklı yordam / işlev arşiv kitaplığı mı ayarlıyorsunuz?


17

Sistemdeki tüm veritabanlarında kullanılmak üzere C # CLR'de geliştirdiğim kodu kullanmak istiyorum, böylece her birini güvenilir bir şekilde ayarlamak ve CLR'yi açmak ve her birinin içinde aynı kodun bir demetini tutmak zorunda değilim .

Bunu yönetim ve güvenlik açısından yapmanın en iyi yolu var mı? CLR fonksiyonları dize kesiciler, e-posta doğrulama, url en / kod çözme, base64, vb gibi çok temel. Ben her veritabanındaki sadece dbo şema işlevlerine erişmek için istiyorum.

  1. Bunu yapmanın basit bir yolu var mı?
  2. Ayrıca CLR dll gömülü olup olmadığını açık değilim ve ben veritabanı taşımak, birlikte etiketler, ya da ben de dll taşımak zorunda.

Teşekkürler


1
Tamam iyi geliyor. Soruyla ilgili ölü sessizlikten kriket duymadığım sürece. Stackoverflow her zaman şans vardı
Alex Erwin

1
dba.se, SO'dan daha az çılgınca, ama bir gün içinde böyle bir soruya iyi dikkat edeceğinizden eminim. Bu kadar sabırlı olmaktan mutlu musun?
Jack Douglas

Lol, sabır bir erdemdir. Çok fazla var ve sorunun kendisinin MS'in ele alacağını düşünürdüm. Bazı yararlı işlevleri ortaya çıkarmak isteyen ancak sunucunuzun tam olarak CLR'ye açık olmayan bir SQL Server ana bilgisayarısınız?
Alex Erwin

Yanıtlar:


8

Şirketimizde tam olarak bu düzene sahibiz. Bir CLR derlemesi oluşturduğunuzda, derlemenin ikili bir temsili, oluşturduğunuz veritabanı içinde depolanır. Bu, veritabanını herhangi bir zamanda taşımanız durumunda yanınıza almanızı (ve hatta komut dosyasını çıkarmanızı) sağlar.

Birkaç ay önce veri merkezimiz su bastı - birkaç sunucuyu suyla doldurdu. Onları yeniden inşa zaman ben sadece önceki gece alınmış olan db yedeklerini kullanılır. Şimdiye kadar hiç sorun yaşamadık .. (ahşap dokun!)

Bunun güvenlik açısından yapılacak doğru şey olup olmadığından emin değilim, ancak CLR işlemlerine vb. Erişim verme şeklimiz paylaşılan veritabanı içinde bir rol oluşturmak ve daha sonra bu veritabanına diğer veritabanlarındaki kullanıcıları eklemek. Daha sonra role CLR işlemlerinde yürütme izni verilir.

CLR, içerdiği veritabanının dışında erişim kaynakları gibi şeyler yapmaya çalışıyorsa erişim sorunları olabilir, ancak oluştururken derleme iznini ayarlayabilirsiniz. Aşağıdaki bağlantıda, izinlerle ilgili burada açıklayabileceğimden çok daha fazla bilgi var:

http://msdn.microsoft.com/en-us/library/ms345101.aspx

Umarım bunun sana yardımı olur.


6

Derleme ikili veritabanı veritabanında bir blob olarak saklanır, böylece veritabanı nereye giderse gidin taşınır. CLR yalnızca örnekte etkinleştirilir - bunun için veritabanına özgü ayarlar yoktur.

Her halükarda, bunu neden yapmaya çalışıyorsunuz?

(Tartışmacı olmaya çalışmıyorum; Sadece ilgili nedenleri duymak istiyorum, çünkü belki de sorun ihtiyaçlarınızı karşılayan farklı bir şekilde çözülebilir.)


Derlemeyi paylaşılan bir veritabanına koymak dışında bunu kolayca yapmanın bir yolu yoktur.

Bununla birlikte, merkezileştirmek için çok zorlayıcı nedenleri olan özel bir durum olmadığı sürece, veritabanı merkezli mimariyi kucaklamanın avantajlı olacağını düşünüyorum. Bunun nedeni, derlemeyi (veya bu konuyla ilgili herhangi bir şeyi) veritabanının dışına koymanın ortamınızda bir bağımlılık yaratmasıdır. Bu, Microsoft'un SQL Server 2012'den başlayarak İçerdiği Veritabanları ile geliştirdiği tam tersi yaklaşımdır.

  • Çoğaltma veya kümeleme gibi özellikleri kullanmaya başladığınızda, bu bağımlılık, konuşlandırmaya büyük olasılıkla büyük miktarda karmaşıklık katmanın yanı sıra sorun giderme ve yük devretme yordamlarına da katkıda bulunabilir.

  • Bu mimari, sisteme aşina olmayan kişiler için çok daha az açıktır (yani, daha az kendi kendine keşfedilebilir ve daha az kendi kendine belgeleme).

  • Farklı veritabanlarında veya varyasyon içeren herhangi bir şeyde farklı güvenlik gerektiren bir durum varsa, incinme dünyasındasınız demektir.

  • Bu veritabanları müşterilere dağıtılırsa (görünmeyecek gibi görünür, ancak bunu eksiksizlik için söyleyeceğim), dağıtım prosedürüne, bakım ve sorun gidermeye karmaşıklık katar.

  • Tüm veritabanları bu kodu paylaşacağından, herhangi bir hata tanıtıldıysa (veya düzeltildiyse), bu durum veritabanlarına dayanan tüm uygulamaları bozabilir . Kapsamlı birim testi mutlak bir zorunluluktur.

Aynı işlevselliğe ihtiyaç duyan birkaç veritabanınız varsa, egzersizin amacı olduğunu düşündüğüm çoğaltma miktarını azaltmanın başka yolları da vardır. Oldukça karmaşık bir CLR meclisi bile veritabanındaki verilere kıyasla (neredeyse her zaman) çok fazla fiziksel depolama alanı kaplamaz, bu yüzden tam anlamıyla buna ihtiyaç duyan binlerce küçük veritabanınız yoksa bunu geçerli bir argüman olarak görmüyorum montaj.

Yapabileceğiniz şey, kaynak çoğaltmayı azaltmak için bu veritabanları için dağıtım yordamının diğer bölümlerini değiştirmek. Örneğin, derlemeyi kaynak denetiminde CLR kodunun ortak konumundan oluşturun ve dağıtın. Veya, aynı derleme veritabanlarına dağıtan bir komut dosyası oluşturun. İşlerin bu bölümünü mümkün olduğunca otomatikleştirin ve önemli olmayacak.

Önerdiğim şeyin bir tutarsızlık olduğuna katılıyorum, çünkü yine de bir miktar kopyalama olacak, ancak bu, öngörülen standarda uymayan bir mimarinin uygulanmasıyla ilgili olumsuzluklarla dengelenmek zorunda. Ortamınız için neyin doğru olduğuna yalnızca siz karar verebilirsiniz.


Muhtemelen bir şeyleri kırmakla ilgili noktanızı görüyorum, ancak kodların yuvarlanmasını basitleştirmek. Burada hiçbir geliştirici ordusu yok. Benim. Ancak veritabanını kullanan başkaları var, bu yüzden tanımladığım saklı yordamlar kullanılmadıkça işlevlerine erişilemez olduğundan emin olmak gerekir.
Alex Erwin

1

Diğer iki cevaplar doğru devlet olarak Meclisleri belli veritabanına yüklenir ve (Ben eminim olmasa sistem genelinde olduğu assembly_iddeğeri olan eşsiz sistem genelinde). Bu, yüklendikleri her veritabanı ile yedeklendikleri ve geri yüklendikleri anlamına gelir.

Ayrıca, (via ) öğesininenabled / disabledayarı sistem çapındadır. Bir yan not olarak, bu ayar yalnızca kullanıcı tarafından oluşturulan CLR işlevselliği içindir; Genel yerleşik CLR her zaman etkindir çünkü bazı yerleşik işlevler buna bağlıdır.CLR Integrationsp_configure

Bununla birlikte, buradaki diğer iki cevap geçerli puanlar verirken, bu noktalar SQLCLR'ye özgü değildir ve bu kararı verirken SQLCLR koduna özgü faktörlerden bahsedilmemektedir. Her bir veritabanına kod dağıtırsanız (birçok veritabanınız olduğu varsayılarak), potansiyel kaynak çekişme sorunlarıyla, güvenlikle ilgili olası sorunlarla vb. Dikkate alınması gereken bellek sorunları vardır.

Merkezi veritabanı veritabanı ve bireysel veritabanı dağıtımı arasında karar verirken, özellikle SQLCLR kodu için akılda tutulması gereken şeylerin kapsamlı bir liste ne sağlamıştır. Listeyi burada kopyalamak yerine, lütfen aşağıdaki cevaba bakın (burada DBA.SE'de de):

Performans açısından CLR İşlevi nasıl daha iyi kullanılır (her DB'nin içinde tekrarlayın veya genel işlevi vardır)?

Ayrıca, ilgili bir notta, herhangi bir veritabanının neden ayarlandığını sorgularım TRUSTWORTHY ON. Soruda belirtilen işlevsellik (yani, "dize kesiciler, e-posta doğrulaması, url en / kod çözme, base64, vb.") Bir SAFEMontaj içinde mümkündür . Kesinlikle gerekli olmadıkça EXTERNAL_ACCESSveya UNSAFEperission_set değerlerini kullanmamalısınız . Ve bazı fonksiyonlar için gerekliyse, bunlar sadece SAFEveri içeren ve skaler fonksiyonların var IsDeterministic = trueolan performans avantajından faydalanabilecek şekilde işaretlenen herhangi bir skaler fonksiyon olacak şekilde kod içeren ayrı bir Montajda olmalıdır. paralel planlara katılabilir.

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.