İki veritabanı aras...
 
Bildirimler
Hepsini Temizle

İki veritabanı arasında değişen fieldlar  

  RSS
unalaygun
(@unalaygun)
Üye

Aşağıdaki kodlar daha çok yazılımcı arkadaşlara yardımcı olur diye düşünüyorum. Ama herkesin elinin altında bulunması gereken bir kod.
Diyelim Bir program yazdınız ve sattınız. Program üzerinde yeni geliştirmeler yaptınız. Veri tabanında eklenen ya da çıkarılan fieldlar var. Tek tek bakmaya gerek yok. Aşağıdaki kodlar bunu sizin yerinize yapar. İyi çalışmalar.

declare @myserver varchar(100)
declare @mydb varchar(100)
declare @surumserver varchar(100)
declare @surumdb varchar(100)
set @myserver='172.20.1.32'
set @mydb='SERENDIPKARGO'
set @surumserver='1.db'
set @surumdb='2.db'

EXEC('  SELECT
         sclmns.id,
         sclmns.scale,
         sclmns.prec,
         table_name=so.name,
         column_name=sclmns.name,
         datatype=systypes.name
    into #'+@surumdb+'
    FROM ['+@surumserver+'].['+@surumdb+'].[dbo].sysobjects so
    JOIN ['+@surumserver+'].['+@surumdb+'].[dbo].syscolumns as sclmns ON so.id = sclmns.id
   JOIN systypes ON sclmns.xtype=systypes.xtype
   WHERE so.xtype=''U''
   and sclmns.xtype in (167,127,106,231,104,56,61,189)
ORDER BY so.name,sclmns.colid;

  SELECT
         sclmns.id,
         sclmns.scale,
         sclmns.prec,    
         table_name=so.name,
         column_name=sclmns.name,
         datatype=systypes.name,
         length=systypes.length into #'+@mydb+'
    FROM ['+@myserver+'].['+@mydb+'].[dbo].sysobjects so
    JOIN ['+@myserver+'].['+@mydb+'].[dbo].syscolumns as sclmns ON so.id = sclmns.id
   JOIN systypes ON sclmns.xtype=systypes.xtype
   WHERE so.xtype=''U''
   and sclmns.xtype in (167,127,106,231,104,56,61,189)
ORDER BY so.name,sclmns.colid;

select
''alter table ''+sdb.table_name+'' ALTER COLUMN ''+sdb.column_name+'' ''+
case
when sdb.datatype=''bigint'' then ''bigint''
when sdb.datatype=''decimal'' then ''decimal(''+cast(sdb.prec as varchar(20))+'',''+cast(sdb.scale as varchar(20))+'')''
when sdb.datatype=''nvarchar'' then ''nvarchar(''+cast(sdb.prec as varchar(10))+'')''
when sdb.datatype=''bit'' then ''bit''
when sdb.datatype=''int'' then ''int''
when sdb.datatype=''datetime'' then ''datetime''
when sdb.datatype=''timestamp'' then ''timestamp''
end as ''DegisenKolonlar'' into #table
from  #'+@mydb +' as mdb
inner join #'+@surumdb+' as  sdb on  mdb.prec!=sdb.prec and mdb.table_name=sdb.table_name and mdb.column_name=sdb.column_name
where sdb.prec>mdb.prec;

select * from #table
where DegisenKolonlar is not null

');

Alıntı
Gönderildi : 20/03/2009 21:29
Hakan Uzuner
(@hakanuzuner)
Kıdemli Üye Yönetici

Teşekkürler Ünal bey

Danışman - ITSTACK Bilgi Sistemleri
****************************************************************
Probleminiz Çözüldüğünde Sonucu Burada Paylaşırsanız.
Sizde Aynı Problemi Yaşayanlar İçin Yardım Etmiş Olursunuz.
Eğer sorununuz çözüldü ise lütfen "çözüldü" olarak işaretlerseniz diğer üyeler için çok büyük kolaylık sağlayacaktır.
*****************************************************************

CevapAlıntı
Gönderildi : 21/03/2009 04:48
CozumPark
(@cozumpark)
Onursal Üye Yönetici

Konu açılalı epey olmuş gerçi ama; ben yeni gördüm ve epeydir nasıl olabileceğini düşündüğüm bir soru tekrar zihnimde hortladı:


 Index olan alanlar ne olacak? Ayrıca bu index'lerin null olmaması da gerekiyorsa?


Ayrıca yeni alanların null olmaması gerekiyorsa bu alanlar ne olacak?


Peki yeni oluşturulan alanların ilişkileri olması gerekiyorsa ne olacak?


Ayrıca yeni alanlar, eğer bir diyagramda kullanılmışlarsa ve tanımlılarsa ne olacak?


Bu kod tablolardaki yeni alanları incelerken aynı zamanda view'lardaki alanları da inceliyor mu?


Trigger'lar oluşturulmuşsa yeni veritabanında bunlar sıfırdan oluşturuluyor mu? Aynı soru stored procedure'ler için de geçerli?


Sorularım devam edecek ama eğer yazdığınız kod bunları da yapabiliyorsa ne güzel [:)]

CevapAlıntı
Gönderildi : 25/02/2010 01:40
Paylaş: