SQL Server kullanan web uygulamaları geliştiriyorken, herhangi bir sorguyu uygulamaya ait olan tüm tablolar veya tüm veritabanları üzerinde çalıştırmayı istemek çok seyrek karşılaşılan bir durum değil. Buna verilebilecek en yaygın iki örnek muhtemelen bir veritabanı içerisindeki tüm tabloları silmek ve tüm tabloların collation değerini değiştirmektir. Benzer şeyleri bir SQL Server instance üzerindeki tüm veritabanları için yapmak da istenebilir.

Bir çok kişinin böyle durumlarda çözüm olarak gördüğü şey söz konusu sorguyu her tablo/veritabanı için bir kez çalıştırmaktır. Ancak bu yöntemin aslında bir çözüm olmadığı tablo/veritabanı sayısı arttıkça gittikçe kullanılamaz bir hal almasından belli olmaktadır.

Konu hakkında biraz daha bilgi sahibi olan kişilerin aklına ise büyük ihtimalle cursor kullanmak ya da verdikleri sorguyu söz konusu olan her tablo/veritabanı için bir kez çalıştıracak olan bir stored procedure yazmak gelecektir. Her iki çözüm de yukarıdaki paragrafta bahsettiğim çözüme göre çok daha mantıklı olmakla birlikte, basit işler için karmaşık ve gereksizdir. Öyle olmasının sebebi ise SQL Server'daki master veritabanı içerisinde bu tür işlemlerin kolaylıkla yapılmasını sağlayacak stored procedure'lerin  zaten tanımlanmış olmasıdır. Bu yazımda, bahsetmiş olduğum işlemleri tek komutla yapmanızı sağlayan, çok işe yarar bulduğum sp_Msforeachtable ve sp_MSforeachdb prosedürlerinden bahsedeceğim.

Sitelerini paylaşımlı bir hosting hesabı üzerinde barındıran, ya da herhangi bir sebepten dolayı veritabanı sunucuları üzerinde tam kontrole sahip olmayan SQL Server kullanıcılarını, SQL Server 2008'in yanında gelen SQL Server Management Studio 2008'in kötü bir süprizi (bug'ı desem daha doğru olur) bekliyor. Sitemi GoDaddy sunucularındaki paylaşımlı hesabıma transfer ederken biraz zamanımı çalan bu hatanın sebebini ve çözümünü burada anlatacağım.

Problem kendini, Management Studio 2008 ile veritabanı sunucusuna gayet normal bir şekilde bağlandıktan sonra, sol taraftaki "Object Explorer" bölümündeki "Databases" dalını açmaya kalktığınız zaman belli ediyor.

management studio 2008 object explorer

Databases dalına basıldıktan sonra, object explorer yukarıda göstermiş olduğum halde uzun bir süre beklemeye başlıyor. Siz sabırla listenin alınmasını bekliyorsunuz ancak bir süre sonra veritabanlarının listesiyle değil, aşağıdaki hata mesajı ile karşılaşıyorsunuz.

management studio error 916

Bu mesajda mavi ile kapatmış olduğum yerde veritabanına girerken kullandığım kullanıcı adım, siyah ile kapatmış olduğum yerde ise benimle uzaktan yakından alakası olmayan birinin veritabanının adı yazıyordu. Mesajı ilk gördüğümde hatanın bende olduğunu düşünüp yaptığım her adımı defalarca kez kontrol ettim. Ancak sonuç alamayınca biraz araştırma yaptım ve sorunun benden değil, Management Studio 2008'deki saçma bir bug'dan kaynaklandığını öğrendim.