19 Haziran 2015 Cuma

Toplu Sql nesne scriptleri

Merhaba arkadaşlar,

otomatik olarak güncellenmeyen yazılımlar için, benim gibi yazılım desteğinde çalışanların en sık yaptıkları şey veritabanı neslelerini(görünümler, prosedürler, fonksiyonlar gibi) güncellemek olmaktadır. Sürekli değişen prosedürler, görünümler, fonksiyonların, uygulamalarla birlikte güncellenmeleri gerektiği muhakkak. Kaynak veritabanından her nesnenin scriptini alıp bunu hedef veritabanında tek tek çalıştırmak uzun ve dikkat gerektiren bir iştir. çünkü güncellemeyi atladığınız herhangi bir nesne size müşteri tarafından hata bildirimi olarak geri döner. Bu makalemde bu işlemleri kolaylaştırmak adına oluşturduğum bir prosedürü sizinle paylaşmak istiyorum.

Esas olarak bir sql prosedürü olan sp_helptext'in istenen tüm nesleler için çalışmasını sağlayacağız. Prosedür parametre olarak aldığı text içerisinden ,(virgül)'le ayrılan her bir nesne için sp_helptext sonucunu, tek alanı olan geçici tabloya işleyecek ve nihayetinde bu tabloyu döndürecek.

create procedure [dbo].[sp_returnObjectScripts]     
@objName nvarchar(512)  sp
as 
begin 

--bu tabloya sp_helptext sonuçlarını işleyeceğiz.
create table #tmpUpdatedText(clText nvarchar(max) collate database_default) 
 
declare @parobjName nvarchar(64) 
/*kürsör içinde her bir nesne ismini bu değişkene atıp, veritabanında varlığını kontrol eden ve
varsa silen kodu tabloya ekliyoruz.
*/

DECLARE c1 CURSOR FOR
    select data from fn_split(@objName,',') s
    join sys.objects o on o.name = s.data
    --kürsörümüz parametre içindeki tüm nesneler için dönecek. sys.object eşleşmesi ile nesnenin varlığını da kontrol etmiş oluyoruz.
 
    OPEN c1; 
    FETCH NEXT FROM c1 INTO @parobjName;    
 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
   insert #tmpUpdatedText(clText) 
/*kürsör içinde her bir nesne ismini bu değişkene atıp, veritabanında varlığını kontrol eden ve
varsa silen kodu tabloya ekliyoruz.*/  

   select  
'IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].['+  @parobjName + ']'')) ' + CHAR(13) + CHAR(10) +  
'DROP ' +  
   (CASE WHEN type_desc in ('SQL_STORED_PROCEDURE') then 'PROCEDURE ' 
   WHEN type_desc in ('SQL_SCALAR_FUNCTION','SQL_TABLE_VALUED_FUNCTION','SQL_INLINE_TABLE_VALUED_FUNCTION') then 'FUNCTION ' 
   WHEN type_desc in ('VIEW') then 'VIEW ' END) 
   + '[dbo].[' + @parobjName + ']' 
   from sys.objects where name = @parobjName; 
   insert #tmpUpdatedText(clText) 
   values 
   ('GO'); 
--burda da nesneyi sp_helptext prosedürüne parametre olarak verip sonucu yine geçici tabloya yazıyoruz.
   insert #tmpUpdatedText(clText) 
   exec sp_helptext @parobjName; 
   insert #tmpUpdatedText(clText) 
   values 
   ('GO'); 
     FETCH NEXT FROM c1 INTO @parobjName; 
     END; 
 
    CLOSE c1; 
DEALLOCATE c1; 
 
select * from #tmpUpdatedText; 
drop table #tmpUpdatedText;  
end;


böylece güncellemek istediğimiz prosedür view yahut fonksiyonları oluşturduğumuz bu araca parametre olarak verip toplu olarak oluşturma scriptlerine sahip olacağız.

örnek kullanım:
sp_returnObjectScripts 'fn_split,sp_helptext,sp_returnObjectScripts'

bir sonraki paylaşımda görüşmek dileğiyle.
Yaşar Şahin

Hiç yorum yok:

Yorum Gönder