Microsoft’un resmi olarak paylaşmadığı ve kullanmayı tavsiye etmediği ama zaman zaman çok yardımcı olan bazı veri tabanı nesneleri; saklı yordamlar(stored procedure,SP) SQL Server bünyesinde bizlere çaktırılmadan sunuluyor. Benim zamanında çok faydalandığım bu SP’ler ile yakın zamanda tekrardan haşır neşir olma durumum oldu. Hemen kısaca paylaşacak birşeyler de çıkmış oldu böylece 🙂 Dokümante edilmeyen bu SP’ler daha çok Microsoft’un kendi iç uygulamalarında ya da kendi ihtiyaçları doğrultusunda geliştirilmiş SP’ler. SP’lerin çoğunun içeriğini göremiyoruz ve bu SP’ler herhangi bir güncelleme ya da versiyon değişikliğinde değişmiş olabilir. Microsoft’un hizmet olarak sunmadığı ve desteklemediği bu SP’leri bu bilinç ile kullanabiliyoruz. Ama üretim ortamlarında kullanılması Microsoft’un desteklemediği bir durum.
Bahsetmiş olduğum bu dokümante edilmeyen SP’ler, bir çoğumuzun sistem nesneleri diye bildiği sys. şeması altında. sp_MS% ile başlayan bu SP’ler isimlerinden kısmen yaptıklarını anlatır durumda. Tüm SQL Server seviyesinde gerçekleştirmek istediğiniz bir çok operasyonu bu SP’ler sayesinde yapabiliyorsunuz. Mesela SQL Server’daki tüm veri tabanlarında bazı değişiklikler yapmak, bir veri tabanındaki tüm tablodaki INDEX’leri tekrardan oluşturmak, veri tabanındaki tüm tabloların isimlerini değiştirmek ya da spesifik kolon eklemek gibi gibi işlemleri bu SP’ler sayesinde yapabiliyoruz.
Mesela veri tabanındaki tüm tablolara standart bir kolon eklemeniz gerekecek. Veri tabanındaki tablo sayınız 200 civarında diyelim. Örnek senaryoda 200 adet olan tablo içeren veri tabanımızdaki tüm tablolara FirstName ve LastName diye 2 kolon ekleyelim. Bu işlemi tek bir SP yardımı ile çok kolay bir şekilde yapabiliyoruz. Bu senaryo için kullanacağımız SP, sp_MSforeachtable olsun…
EXEC sp_MSforeachtable N'ALTER TABLE ? ADD [FirstName] VARCHAR(100), [LastName] VARCHAR(100)';
Mesela tüm tablolardaki son 5 kaydı görmek istediğimizde de aşağıdaki gibi bir SP kullanabiliriz. Dikkat ederseniz SP’ye parametre olarak isteğimiz her türlü SQL sorgusunu şablon olarak verebiliyoruz. ? anahtar simgesini kullanarak SP’nin tüm tablolar için çalıştığında ? yerine tablo isminin geldiğini söyleyebilirim. Aşağıda da tüm tablolar için çalışacak bir SELECT sorgusu örneğine bakalım…
EXEC sp_MSforeachtable N'SELECT TOP 5 * FROM ? with (nolock) ORDER BY ID desc'
Örnek olması için sadece tablo seviyesindeki işlemleri yapabilmek için SP’yi paylaştım ancak bir çok farklı SP mevcut. Dediğim gibi bazı SP’lerin içeriğini görebiliyoruz ama bazıları açılmıyor. SP parametreleri ile SP’lerin nasıl çalıştığını deneyerek biraz debelenmek gerekiyor.
Dokümante edilmeyen bu SP’lerin varlığından haberdar olmak bazı operasyonlar için uğraşmayı kolaylaştırıyor. Fikir vermesi adına umarım faydalı olmuştur… Şimdilik bu kadar.
Not: Bu arada bu yazıyı yazarken MS SQL Server 2017‘yi macOS üzerinde Docker üstünde çalıştırdım. Ayrıca SQL Operations Studio ile SQL sorgularını çalıştırdım.