🙂 İNSANLARIN EN HAYIRLISI INSANLARA FAYDALI OLANDIR 🙂

Ramazan HABER / MSSQL RMOS / İki veri tabanı arasındaki farklılıkları bulur tablo , procedür , column compare

1-) MSSQL RMOS - İki veri tabanı arasındaki farklılıkları bulur tablo , procedür , column  compare

 

CREATED BY MUSTAFA

 

 

Select ISNULL(s.name, m.name) AS name

Into #Tables

From databasename1.sys.tables m

Full Join databasename2.sys.tables s On s.name = m.name

 

--Select * From #Tables Order By name

Declare @Columns1 Table (name Nvarchar(50))

Declare @Columns2 Table (name Nvarchar(50))

Declare @Columns Table (name Nvarchar(50))

 

Declare @Sonuc Table (Tur Nvarchar(50), Tablo Nvarchar(50), Kolon Nvarchar(50), Prosedur Nvarchar(50), Aciklama Nvarchar(MAX))

 

BEGIN -- Tablolar Karşılaştırıyor

Declare DonguTablo Cursor For Select * From #Tables Order By name

Declare @TblName Nvarchar(50)

OPEN DonguTablo

FETCH NEXT FROM DonguTablo INTO @TblName

WHILE @@FETCH_STATUS = 0

BEGIN

Declare @IsDb1Tbl bit = (Select COUNT(*) From databasename1.sys.tables where type='U' and name = @TblName)

Declare @IsDb1Tb2 bit = (Select COUNT(*) From databasename2.sys.tables where type='U' and name = @TblName)

 

IF @IsDb1Tbl = @IsDb1Tb2 -- Aynı tablolar var ise kolonlar karşılaştırılıyor

BEGIN

DELETE FROM @Columns

DELETE FROM @Columns1

DELETE FROM @Columns2

 

Insert Into @Columns1 (name)

Select c.name

From databasename1.sys.columns c

Left Join databasename1.sys.tables t On t.object_id = c.object_id

Where t.name = @TblName

Insert Into @Columns2 (name)

Select c.name

From databasename2.sys.columns c

Left Join databasename2.sys.tables t On t.object_id = c.object_id

Where t.name = @TblName

 

Insert Into @Columns (name)

Select ISNULL(s.name, m.name) AS name

From @Columns1 m

Full Join @Columns2 s On s.name = m.name

 

Declare DonguColumn Cursor For Select * From @Columns Order By name

Declare @ClmName Nvarchar(50)

OPEN DonguColumn

FETCH NEXT FROM DonguColumn INTO @ClmName

WHILE @@FETCH_STATUS = 0

BEGIN

Declare @IsDb1Cll bit = (Select COUNT(*) From @Columns1 where name = @ClmName)

Declare @IsDb1Cl2 bit = (Select COUNT(*) From @Columns2 where name = @ClmName)

 

IF @IsDb1Cll <> @IsDb1Cl2

BEGIN

IF @IsDb1Cll = 1

INSERT INTO @Sonuc (Tur, Tablo, Kolon, Aciklama)

Select 'Column', @TblName, @ClmName, '1. Veritabannda Eksik'

ELSE

INSERT INTO @Sonuc (Tur, Tablo, Kolon, Aciklama)

Select 'Column', @TblName, @ClmName, '2. Veritabannda Fazla'

END

 

FETCH NEXT FROM DonguColumn INTO @ClmName

 

END

 

CLOSE DonguColumn

DEALLOCATE DonguColumn

 

END

 

IF @IsDb1Tbl <> @IsDb1Tb2 -- Aynı tablolar yok ise farklı olan yazılıyor

BEGIN

IF @IsDb1Tbl = 1

INSERT INTO @Sonuc (Tur, Tablo, Aciklama)

Select 'Tablo', @TblName, '1. Veritabannda Eksik'

ELSE

INSERT INTO @Sonuc (Tur, Tablo, Aciklama)

Select 'Tablo', @TblName, '2. Veritabannda Fazla'

END

 

FETCH NEXT FROM DonguTablo INTO @TblName

END

 

CLOSE DonguTablo

DEALLOCATE DonguTablo

 

DROP TABLE #Tables

END

 

BEGIN -- Prosedürler Karşılaştırışıyor

Select p.name, REPLACE(REPLACE(REPLACE(REPLACE(definition, CHAR(13),' '), CHAR(10),' '), CHAR(9), ''), ' ', '') As definition

Into #Db1Proc

From databasename1.sys.procedures p

Left Join databasename1.sys.all_sql_modules m On m.object_id = p.object_id

Select p.name, REPLACE(REPLACE(REPLACE(REPLACE(definition, CHAR(13),' '), CHAR(10),' '), CHAR(9), ''), ' ', '') As definition

Into #Db2Proc

From databasename2.sys.procedures p

Left Join databasename2.sys.all_sql_modules m On m.object_id = p.object_id

 

Select ISNULL(s.name, m.name) AS name

Into #Procedures

From #Db1Proc m

Full Join #Db2Proc s On s.name = m.name

 

Declare DonguProc Cursor For Select * From #Procedures Order By name

Declare @ProcName Nvarchar(50)

OPEN DonguProc

FETCH NEXT FROM DonguProc INTO @ProcName

WHILE @@FETCH_STATUS = 0

BEGIN

Declare @IsDb1Prl bit = (Select COUNT(*) From #Db1Proc where name = @ProcName)

Declare @IsDb1Pr2 bit = (Select COUNT(*) From #Db2Proc where name = @ProcName)

 

IF @IsDb1Prl = @IsDb1Pr2 -- Aynı Prosedur var ise içerik karşılaştırılıyor

BEGIN

IF (Select REPLACE(definition, ' ', '') From #Db1Proc where name = @ProcName) <> (Select REPLACE(definition, ' ', '') From #Db2Proc where name = @ProcName)

INSERT INTO @Sonuc (Tur, Prosedur, Aciklama)

Select 'Prosedür', @ProcName, 'Farklılık var'

END

 

IF @IsDb1Prl <> @IsDb1Pr2 -- Aynı Prosedur yok ise yazılıyor

BEGIN

INSERT INTO @Sonuc (Tur, Prosedur, Aciklama)

Select 'Prosedür', @ProcName, 'Mevcut Değil var'

END

 

FETCH NEXT FROM DonguProc INTO @ProcName

 

END

 

CLOSE DonguProc

DEALLOCATE DonguProc

 

DROP TABLE #Procedures

DROP TABLE #Db1Proc

DROP TABLE #Db2Proc

END

 

Select * From @Sonuc Order By Tur

 

 

 

CREATED BY MUSTAFA

 2023 Temmuz 19 Çarşamba
 249