T-SQL Refresh sql module (Meta Data Güncelleme-sp_refreshsqlmodule)

Genellikle tablo fonksiyonuna (user-defined function) bağlı bir tabloda alan tipi değişikliği veya alan ekleme gibi işlemlerden sonra tablo fonksiyonumuzda (user-defined function) hata alabiliriz yada eklediğimiz alan fonksiyonumuza yansımayabilir. Bunu düzeltmek için de fonksiyonumuzu silip yeniden oluşturmak iyi bir fikir gibi gözükebilir. Bunun yerine ” sp_refreshsqlmodule ” prosedürünü çalıştırdığımızda sorunumuz ortadan kalkacaktır.

Bu prosedür şemaya bağlı olmayan prosedür (stored procedure) ve kullanıcı fonksiyonları (user-defined function) gibi nesnelerin meta datalarını günceller bu sayede yapılan değişiklikler nesnemizin meta verilerine işlenir ve sorunumuz çözülür. Bunu basit bir örnekle test edelim.

1- Bakiyeler tablosunun tüm sütunlarını içeren basit bir fonksiyon (user-defined function) oluşturduk.

2-Fonksiyonumuzun çıktısı bu şekilde. Şimdi tablomuzda bir değişikliğe gidelim…

3- Tablomuza bir sütun daha ekledik.

4-Tablo fonksiyonumuzu tekrar çalıştığımızda oluşturduğumuz sütunu göremiyoruz. Çünkü fonksiyonumuzun kalıcı olarak meta datası oluşturulurken bu alanımız yoktu. Bu nedenle meta datayı güncellemek sorunumuzu çözecektir.

5- sp_refreshmodule prosedürünü çalıştıdırdıktan sonra fonksiyonumuzu çalıştırıyoruz ve eklediğimiz alan artık fonksiyon çıktımızda da mevcut.

Evet basit bir örnekle nasıl işe yaradığını görmüş olduk.

Ayrıca istediğimiz nesnelerin meta datalarını topluca tek seferde güncellemek için aşağıdaki gibi bir sorguyu da kullanabiliriz.

6- ” sp_refreshsqlmodule ” ile toplu meta data güncelleme.

7- ” sp_refreshsqlmodule ” ile toplu meta data güncelleme.text



DECLARE @fn_name NVARCHAR(max) --NESNEMİZİN ADINI TUTACAĞIMIZ BİR DEĞİŞKEN OLUŞTURUYORUZ.
DECLARE @refresh_count INT=0  -- SAYDIRMA İŞLEMİ YAPMAK İÇİN OLUŞTURUYORUZ.


DECLARE refresh_function_cursor CURSOR -- SATIRDA İŞLEM YAPMAK İÇİN CURSOR OLUŞTURUYORUZ.
FOR

/*BEN BU ÖRNEKTE DATABESE DE 'fn_Ki' İLE BAŞLAYAN TABLE FONKSİYONLARININ META DATALARINI GÜNCELLEYECEĞİM.*/

SELECT name FROM sys.objects where type='IF' and name like 'fn_Ki%'--CURSOR UN İŞLEM YAPACAĞI VERİ KÜMESİNE AİT SORGUYU YAZIYORUM

OPEN refresh_function_cursor --CURSOR U AÇIYORUZ.
FETCH NEXT FROM refresh_function_cursor INTO @fn_name --CURSORDA VERİ TUTACAĞIMIZ DEĞİŞKENİMİZİ BELİRTİYORUZ.VE VERİYİ İŞLİYORUZ.

WHILE @@FETCH_STATUS=0  -- DÖNGÜYÜ BAŞLATIYORUZ.
BEGIN 
EXEC sp_refreshsqlmodule @fn_name; -- HER SATIRDA FONKSİYON ADLARINI TUTTUĞUMUZ İÇİN PROSEDURU BU ŞEKİLDE EXECUTE EDİYORUZ.

SET @refresh_count=@refresh_count+1 -- HER İŞLEM İÇİN COUNT DEĞERİMİZE EKLEME YAPIYORUZ.

FETCH NEXT FROM refresh_function_cursor INTO @fn_name -- CURSORDA BİR SONRAKİ SATIR VERİSİNİ İŞLİYORUZ.
END

CLOSE refresh_function_cursor -- CURSOR U KAPATIYORUZ.
DEALLOCATE refresh_function_cursor -- BU İŞLEM İÇİN AYRILAN BELLEĞİ TEMİZLİYORUZ.

SELECT @refresh_count AS 'Güncellenen Nesne Sayısı' --BU SORGUYLADA TOPLAMDA KAÇ FONKSİYON GÜNCELLEMİŞİZ ONU GÖRÜYORUZ.

Bunu siz daha da geliştirerek prosedür ile tek satırda da yapabilirsiniz. Umarım faydalı olmuştur…

Daha detaylı bilgi için bkz. https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-refreshsqlmodule-transact-sql?view=sql-server-ver16

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir