Policy based management ile policy oluşturup, oluşturulan policy’yi bir çok sunucuya ve sunuculardaki bir çok nesneye uygulamak mümkün. Bu işlemi yaparken kapsamımızda olmayan nesneleri veya sunucuları hariç tutarak policy’yi sadece hedefimizdeki nesnelere uygulamak yönetim optimizasyonu sağlayacaktır.
Aşağıdaki örnek bir policy oluşturarak hem policy’yi nasıl oluşturacağımızı, hem de filtrelemeyi nasıl verebileceğimizi görelim.
Policy: Transaction log backupları her sunucuda düzenli olarak alınıyor olmalı.
Örnek sunucumuzda aşağıda görülebileceği gibi recovery model’leri simple, full ve bulk_logged olan 3 veritabanı mevcut. Biz transaction log backup kontrolünü sadece recovery model’leri full ve bulk_logged olan veritabanlarında yapacağız.

Policy oluşturmak için management studio’yu kullanacağız. Aşağıda görülebileceği gibi object explorer altında yer alan “Policy Management”ın altında “Policies”, “Conditions” ve “Facets” yer almaktadır. Policy oluşturulurken bu 3 seçenekten yararlanacağız.

Öncelikle policy uygulayacağımız veritabanları için “Condition” oluşturuyoruz. “Conditions” üzerinde farenin sağ tuşuna tılayıp “New Condition” diyerek yeni bir pencere açıyoruz. “Databases to be checked for transaction log backup” adıyla bir condition oluşturalım. “Facet” olarak “Database” seçtiğimizde “expression:” altında seçebileceğimiz “Field” isimleri geliyor. Burada recovery model’leri full ve bulk_logged olan veritabanlarını seçmek için doğru alanları seçiyoruz. @RecoveyModel field’ı bizim için uygun alan. Ekranın bize sağladığı imkanlar kullanarak aşağıdaki gibi şartlarımızı belirtiyoruz.

Bu şekilde hangi veritabanlarına policy’yi uygulayacağımızı belirlemiş oldu.
Şimdi uygulayacağımız policy’nin şartını oluşturalım. “Transaction logs backup time must be less than 10 hours” adıyla bir “Condition” oluşturmak için öncelikle “Facet”i “Database Maintenance” seçiyoruz. Seçebileceğimiz ilgili “Field”lar “Expression:” altında listeleniyor. Buradan @LastLogBackupDate’i seçerek şartımızı oluşturacağız. Örnek olarak, son 10 saat içerisinde transaciton log backup alınmış olmalı şartını oluşturalım. Bunun için “Value” alanına yazabilecceğimiz boşluğun sağındaki 3 noktaya tıkladığımızda yeni bir ekran, “Advanced Edit” açılıyor.

“Advanced Edit” ekranı yardımıyla, “Functions and properties” altında yer alan fonsiyonları kullanarak, “DateAdd('hh', -10, GetDate())” şeklinde amaçladığımız şartı oluşturuyoruz.

Artık transaction log backup time policy şartımız hazır, policy’mizi oluşturabiliriz. Oluşturacağımız policy’nin adı “Transaction logs must be backed up” olsun. Policy’nin adını aşağıdaki gibi verdikten sonra “Check condition” olarak daha önceden oluşturduğumuz conditon’ı seçelim.

Böylece ilgili policy oluşturulmuş olduk. Bu policy herhangi bir instance’daki tüm veritabanlarına uygulanacaktır. Biz recovery model’li simple olan veritabanlarına bu policy’yi uygulamak istemiyoruz. Bunun için aşağıda görülebileceği gibi “Against targets” kısmında daha önceden oluşturduğumuz filtreleme “Conditon”ını seçiyoruz. Eğer default değer olan “Every” seçeneğini değiştirmezsek tüm kullanıcı veritabanlarına policy uygulanacaktır. Filtreleme için kullanılacak conditon “New condition” seçeneği tıklanarak da oluşturulabilir.
Bu şekilde her policy için filtreleme vermek mümkün.

Nesne bazında nasıl filtreleme vereceğimizi öğrendik. Sunucu bazında filtre vermek de mümkün. Hangi sunuculara policy uygulayacağımızı belirleyip “Server restriction” kısmında belirlediğimiz condition’ı seçebiliriz. Örnek olması açısıdan oluşturduğumuz policy’yi sadece versiyonu 2008 olan sunuculara uygulayalım. Bunun için aşağıdaki gibi yeni bir condition oluşturuyoruz. Facet olarak “Server” seçilmeli çünkü server restriction olarak kullanacağız. @VersionMajor = 10 şartı bize sadece SQL Server 2008 sunucuları tanımlamaktadır.

Şimdi “Server restriction” olarak oluşturduğumuz condition’ı seçebiliriz. Oluşturduğumuz policy sadece SQL 2008 ve 2008 R2 versiyonlu sunuculara uygulanacaktır.
Hedeflediğimiz policy’yi oluşturduk ve bunun için aşağıda görülebileceği gibi 3 tane condition’dan yararlandık.

Şimdi bu policy’yi çalıştıralım. Policy üzerinde sağ tuşa tılayarak “evaluate” dediğimizde, aşağıdaki gibi değerlendirme sonucunu görürüz. Sunucumuzda 3 veritabanı vardı, bir tanesi simple modda olduğu için değerlendirmeye tabi tutulmadı, görüldüğü gibi. Kalan 2 veritabanından bir tanesi policy’ye uygun iken diğeri policy’ye uymadı. Çünkü son 10 saat içerisinde transaction log backup alınmamıştı.

Sonuç: Policy oluştururken hem nesne bazlı hem sunucu bazlı filtre vermek mümkün.