Günlük operasyonlarda SQL Server’ın buluduğu sistem üzerinde çeşitli işlemler yapmamız gerekebiliyor.
Bunların en esnek yöntemlerinden biri de xp_cmdshell vasıtasıyla komut satırından SQL Server’ın servis kullanıcısının yetki alanı içerisinde istediğiniz işlemi yapabilirsiniz. Fakat, özellik varsayılan olarak kapalı gelir. Güvenlik zafiyetleri oluşturabileceğinden dolayı da veritabanı yöneticileri kullanımına çok sıcak bakmaz. Bu yüzden CLR kullanmanız bile gerekebilir ama artık dosya sistemi üzerinde SQL Server 2017 ile birlikte gelen DMV ve DMF sayesinde çok daha basit bir şekilde dosya sistemine erişerek ihtiyaçlarınızı karşılayabilirsiniz.
DMV
- sys.dm_os_enumerate_fixed_drives
DMF
- sys.dm_os_enumerate_filesystem
- sys.dm_os_file_exists
dm_os_enumerate_fixed_drives
Bu DMV ağırlıklı olarak veritabanı yöneticilerinin işine yarayacaktır.
Sunucu üzerinde bulunan diskleri ve boş alanları görüntüleyerek raporlama yapmaları için işlerini kolaylaştıracaktır.
SELECT DrivePath = fixed_drive_path, DriveType = drive_type_desc, FreeSpace_MB = free_space_in_bytes / (1024 * 1024), FreeSpace_GB = free_space_in_bytes / (1024 * 1024 * 1024) FROM sys.dm_os_enumerate_fixed_drives
Resim – 1
dm_os_file_exists
Klasör ve dosyaların sistem üzerinde bulunmalarını kontrol etmenize yaramaktadır.
Özellikle dosya üzerinden ETL işleri yapıyorsunuz sunucunuzun diskine “günlük dosyalar gelmiş mi?” ya da “Backupları başka bir diske düzgün aktarmış mıyım?” tarzında senaryolar için işinize çok yarayacaktır.
Not: Bu DMF’in aslında eski bir versiyonu da mevcut (xp_fileexist)
--Var olan klasör SELECT * FROM sys.dm_os_file_exists('C:\Windows\System32') --Olmayan klasör SELECT * FROM sys.dm_os_file_exists('C:\Windows\System33') --Var olan dosya SELECT * FROM sys.dm_os_file_exists('C:\Windows\System32\odbcad32.exe') --Olmayan dosya SELECT * FROM sys.dm_os_file_exists('C:\Windows\System32\odbcad32.txt')
Resim – 2
dm_os_enumerate_filesystem
Bu DMF üzerinde ise dilediğimiz klasör ve dosya adı kombinasyonuyla arama yapabiliyoruz. Normal şartlarda bütün bu özellikleri xp_cmdshell üzerinden dir çalıştırarak ya da Get-ChildItem komutu ile powershell üzerinden sonuç alabilirsiniz. Fakat, bu detayda bir veri almak ve bunları SQL içerisinde kullanabileceğiniz bir formata çevirmek için çok daha fazla komut yazmanız gerekiyor. Hatta kodlarınızı yeterince dinamik yazamazsanız aynı kodu farklı alanlarda bile tekrar kullanamayacaksınız.
İşte tam bu noktada bu müthiş DMF imdadımıza yetişiyor. Basit bir şekilde bize tablo çıktısı olarak aldığımız bu bilgiler sayesinde rastgele oluşturulmuş isimli dosyalarımızı tarayarak ETL vb. işler için okumamız gereken dosyaları kolayca elde etmiş oluruz.
Bu nokta da son yazma tarihi ve oluşturma tarihi detayları sayesinde dosyalarımızın üzerindeki değişimleri de inceleyebilir ve raporlayabiliriz
SELECT TOP 10 * FROM sys.dm_os_enumerate_filesystem('C:\Windows\', '*')
Resim – 3
Artık xp_cmdshell’den kullanımını biraz daha azaltarak bu pratik yöntemler ile günlük geliştirmelerimiz için bize vakit kazandıracaktır.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
TAGs: SQL Server, SQL Server 2017, Database, Yenilikler, DMV, DMF, dm_os, dm_os_enumerate_filesystem, dm_os_enumerate_fixed_drivers, dm_os_file_exists