İki veritabanının şemasını nasıl karşılaştırabilirim?


19

İki SQL Server veritabanındaki farkları bulmanın bir yolu var mı (yalnızca şema). Biri yerel, ikincisi müşterinin sitesinde. Bazı raporları çalıştıran ve bazı kodların yürütülmediği kristal raporlarda sorun yaşıyoruz ve şemaların eşleşmediği anlaşılıyor.

Her iki veritabanında da aynı komutu çalıştırabilir ve farkların nerede olduğunu söylemek için sonuçları karşılaştırabilir miyim?


SO ile ilgili bu sorunun bazı iyi önerileri var.
LowlyDBA

Yanıtlar:


13

Bağlantı sorunları nedeniyle çok sayıda araçtan birini kullanamıyorsanız ve "çevrimdışı" karşılaştırmayı istiyorsanız, veritabanına sağ tıklayıp "Görevler ... / Oluştur" komutunu kullanarak tüm veritabanı nesneleri için komut dosyaları oluşturmak üzere SSMS'yi kullanabilirsiniz. Komut dosyaları "işlevini kullanın ve nesne başına bir dosya oluşturmayı seçtiğinizden emin olun.

Bunu her iki veritabanı için de yaptığınızda, iki komut dosyasını iki ayrı klasörde yerel bir makineye alın ve ikisini karşılaştırmak için WinMerge (veya benzeri) kullanın.


6

Başka bir seçenek, Visual Studio'nun bir uzantısı olan SQL Server Veri Araçları'nı (SSDT) ​​kullanmaktır. Veritabanı şemanızı .dacpac dosyası olarak ayıklayabilir ve bunu başka bir .dacpac dosyasıyla veya varolan bir veritabanıyla karşılaştırabilirsiniz. SSDT, SQL Server 2012 istemci araçlarına dahildir, bu da onu oldukça erişilebilir kılar. Karşılaştırmayı nasıl çalıştıracağınıza ilişkin tüm talimatları MSDN sitesinde bulabilirsiniz .


6

Aynı görevi yapmak için kolay bir yolla mücadele ettikten sonra - 2 model arasında nelerin değiştiğini görün, yeni ve silinmiş sütunları belirlemek için iki şemayı karşılaştıracak aşağıdaki SQL Komut Dosyasını yazdım

set nocount on;
-- Set the two variables newmodel and oldmodel to the appropriate database names and execute the script

declare @newmodel varchar(50), @oldmodel varchar(50);

Set @newmodel = '[NewModel to Compare]';
set @oldmodel = '[OldModel to Compare]';


Declare @Temp table (TABLE_SCHEMA varchar(40), TABLE_NAME varchar(40), COLUMN_NAME varchar(50), ORDINAL_POSITION int, IS_NULLABLE varchar(5), NullChange varchar(5), Comment varchar(50));

Declare @script varchar(5000);


set @script = '
Select nc.TABLE_SCHEMA, nc.TABLE_NAME, nc.COLUMN_NAME, nc.ORDINAL_POSITION, nc.IS_NULLABLE, IIF(nc.IS_NULLABLE <> oc.IS_NULLABLE, ''Yes'', ''No''), 
        IIF(oc.COLUMN_NAME IS NULL, convert(varchar(20), ''ADDED COLUMN''), convert(varchar(20), ''--'')) as Comment
    from {NEW}.INFORMATION_SCHEMA.COLUMNS nc
        LEFT join {OLD}.INFORMATION_SCHEMA.COLUMNS oc 
            on nc.TABLE_NAME = oc.TABLE_NAME and nc.COLUMN_NAME = oc.COLUMN_NAME
UNION ALL
    Select oc.TABLE_SCHEMA, oc.TABLE_NAME, oc.COLUMN_NAME, oc.ORDINAL_POSITION, oc.IS_NULLABLE, ''No'', ''DELETED COLUMN'' as Comment
    from {OLD}.INFORMATION_SCHEMA.COLUMNS oc
    where CONCAT(oc.TABLE_NAME, ''.'', oc.COLUMN_NAME) 
        not in (Select CONCAT(TABLE_NAME, ''.'', COLUMN_NAME) from {NEW}.INFORMATION_SCHEMA.COLUMNS)
';


Set @script = replace(@script, '{OLD}', @oldmodel);
Set @script = replace(@script, '{NEW}', @newmodel);

--print @script

Insert into @Temp
    exec(@script);

Select * from @Temp where Comment <> '--'
order by TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME;
go

Ekstra yazılım gerektirmeyen hızlı ve kirli bir çözüm için bu harika! Tam da ihtiyacım olan şey bu. Teşekkürler!
Mir

2

Birden fazla veritabanı dosyasını karşılaştırmanız gerekirse komut dosyası yazabilirsiniz SQLPackage.exe.

Sizin için çalışma kodu yok ama bazı ilham için SQLPackage.exe belgelerine bakabilirsiniz .

Ana veritabanınızı bir dacpac dosyasına ayıklar ve sonra dacpac dosyasını veritabanlarınızın geri kalanıyla karşılaştırırsınız. Karşılaştırmanın sonucu, değişikliklerin xml raporu veya veritabanlarını senkronize etmek için çalıştırabileceğiniz bir .sql dosyası olabilir.

Bunun gibi bir şey:

sqlpackage.exe /a:Extract /scs:Server=MyLaptopSQL2014;Database=Test; /tf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac  

ve sonra

sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test1 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest1.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 
 sqlpackage.exe /a:Script /sf:C:UsersKevin3NFDocumentsSQLScriptsDACPACSTest.dacpac /tsn:MyLaptopSQL2014 /tdn:Test2 /op:C:UsersKevin3NFDocumentsSQLScriptsDACPACSDeltasTest2.sql /p:DropObjectsNotInSource=True /p:DropIndexesNotInSource=True 

Örnek kod için bu makaleye veya bu makaleye göz atabilirsiniz .


1

"SQL Server Karşılaştır" için bir arama yapın ve birçok araç bulacaksınız. İşimde kullandığımız kişi Red Gate SQLCompare . 14 günlük bir deneme süresi var. Ancak iki farklı ortamdan bahsettiğiniz için, müşteri size DB'sinin bir yedeğini göndermediği sürece bunun sizin için işe yarayacağını düşünmüyorum. Diğer seçenek sistem tablolarına (sys.indexes, sys.tables, vb.) Karşı sorgu yazmaktır.


Her iki sunucuda da oturum açma varsa SQL Compare iyi çalışır. Her DB için farklı bir oturum açma kullanabilirsiniz, böylece istemci erişiminizin olmasını sağlamalıdır.
Mark Sinkinson

1

En kolay yol, bu amaç için oluşturulmuş otomatik bir araç kullanmaktır , ancak bir tanesine erişiminiz yoksa, ihtiyacınız olan tüm temel bilgileri INFORMATION_SCHEMAgörünümlerden alabilirsiniz.

Meta verileri kullanmak INFORMATION_SCHEMAmuhtemelen DDL komut dosyaları oluşturmaktan ve kaynak karşılaştırması yapmaktan daha kolay bir seçenektir çünkü verilerin nasıl sunulduğu üzerinde çok daha fazla kontrole sahipsiniz. Oluşturulan komut dosyalarının bir veritabanındaki nesneleri sunma sırasını gerçekten denetleyemezsiniz. Ayrıca, komut dosyaları varsayılan olarak uygulamaya bağlı olabilecek bir grup metin içerir ve gerçekten odaklanmanız gereken şey eksik bir tablo, görünüm veya sütun veya bir sütun veri türü olduğunda çok fazla uyuşmazlık "gürültüsüne" neden olabilir. veya boyut uyuşmazlığı.

Kodunuz için önemli olan bilgileri INFORMATION_SCHEMAgörünümlerden almak için bir sorgu (veya sorgular) yazın ve her SQL Server'da SSMS'den çalıştırın. Daha sonra sonuçları bir dosyaya dökebilir ve bir metin dosyası karşılaştırma aracı (MS Word bile) kullanabilir veya sonuçları tablolara dökebilir ve uyuşmazlıkları bulmak için SQL sorguları çalıştırabilirsiniz.


1

Yinelenen olarak işaretlenmiş yeni bir soru uğruna bu cevabı ekliyorum.

Bir zamanlar iki üretim veritabanını karşılaştırmam ve aralarındaki şema farklarını bulmam gerekiyordu. İlgilenilen tek öğe, eklenen veya bırakılan tablolar ve eklenen, kaldırılan veya değiştirilen sütunlardı. Artık geliştirdiğim SQL komut dosyalarına sahip değilim ama genel strateji şu. Ve veritabanı SQL Server değildi, ama aynı stratejinin geçerli olduğunu düşünüyorum.

İlk olarak, en iyi meta veritabanı olarak tanımlanabilecekleri yarattım. Bu veritabanının kullanıcı tabloları, üretim veritabanlarının sistem tablolarından kopyalanan veri açıklamalarını içeriyordu. Tablo Adı, Sütun Adı, Veri Türü ve Hassasiyet gibi şeyler. Üretim veritabanlarının hiçbirinde bulunmayan bir öğe daha, Veritabanı Adı vardı.

Sonra, üretim veritabanlarının sistem tablolarından meta veritabanının kullanıcı tablolarına ekler ile seçimleri birleştiren komut dosyaları geliştirdim.

Son olarak, bir veritabanında var olan ancak diğerinde bulunmayan tabloları ve her iki veritabanındaki tablolardan yalnızca bir veritabanında bulunan sütunları ve iki veritabanı arasında tutarsız tanımlara sahip sütunları bulmak için sorgular geliştirdim.

Yaklaşık 100 tablo ve 600 sütundan, bir tutarsızlık ve bir veritabanında kayan nokta ve diğerinde bir tamsayı olarak tanımlanan bir sütun buldum. Sonuncusu bir nimet olarak ortaya çıktı, çünkü yıllardır veritabanlarından birini rahatsız eden bir sorun ortaya çıkardı.

Meta veritabanı modeli, söz konusu sistem tabloları tarafından önerildi. Sorguların oluşturulması zor değildi, çoğunlukla grup etrafında dönen ve count (veritabanı adı) = 1'e sahipti.

Sizin durumunuzda, 700 üretim veritabanıyla, ilk iki adımı karşılaştırmak için sadece iki veritabanıyla yaptığımdan daha fazla otomatikleştirmek isteyebilirsiniz. Ama fikir benzer.


1

Aynı soruyu sordum ve Microsoft SQL Server Management Studio'nun (SSMS) burada gördüğüm her şeyden çok daha kolay / basit bir çözüme sahip olduğuna inanıyorum. MS SQL Server Express ile bir üretim sitem var ve yakında VisualStudio veya SSMS dışındaki diğer uygulamaları yüklemek istemiyorum birkaç tane daha olmak.

SSMS içinde, şemayı almak için veritabanına sağ tıklayın. Seç Görevler> kodları oluştur ... (isterseniz veya seçilen nesneleri) senaryoya şema ve yapılandırma tüm veritabanı için bir sihirbaz açın. Yol / dosya adı dışındaki tüm varsayılan seçenekleri korudum, ancak aracın çok sayıda seçeneği var. Sihirbaz, OneDrive aracılığıyla PC'ye kopyaladığım bir SQL oluşturdu. Daha sonra SQL SIT veritabanım karşı aynı şekilde oluşturulan bir dosyayı karşılaştırmak için Notepad ++ kullandım. Yorumlardaki tarih / saatteki isabetlere filtre uygulamanız gerekir, ancak aksi takdirde iki veritabanının mükemmel bir karşılaştırmasıdır.

Presto! Bunu yazmak, gerçek karşılaştırmayı yapmaktan çok daha zordu.


0

Kullandığım harika bir araç (bir süredir güncellenmemesine rağmen hala çalışıyor) AdeptSqlDiff

Hem şema hem de veri karşılaştırmalarını karşılaştırır. RedGate gibi, bir maliyet değil, aynı zamanda 30 günlük bir deneme var. Ve fiyatı oldukça makul.




0

Piyasada işi halletmek için kullanabileceğiniz birçok araç var. Şirketim hem karşılaştırma hem de senkronizasyon için ApexSQL Diff kullanıyor çünkü Azure için ücretsiz, ancak Devart veya Redgate araçlarıyla yanlış gidemezsiniz.


0

SQL Server veritabanlarının iki örneğinin tablolarını, görünümlerini, işlevlerini, kullanıcılarını vb. Karşılaştırmak ve kaynak ve hedef veritabanları arasında bir değişiklik komut dosyası oluşturmak için kullanabileceğiniz bir açık kaynak aracı olan SQL DBDiff hayranıyım .


0

MSSQL veritabanlarının hem yapı hem de veri karşılaştırmasını sağlayan bir MssqlMerge yardımcı programı yaptım . Tablo tanımlarını, görünümleri, saklı yordamları ve fonksiyonları karşılaştırmaya izin veren Ücretsiz bir sürümü vardır. Ayrıca, daha fazla nesne türünü destekleyen ve kutudan elde edilemeyen diğer bazı ayrıntıları karşılaştırmak için sistem görünümleriyle ilgili sorgular da dahil olmak üzere herhangi bir sorgu sonucunu çalıştırabileceğiniz ve karşılaştırabileceğiniz 'Sorgu sonucu farklı' özelliğine sahip bir Pro sürümü vardır.


-1

Şuna bir bak:

SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA in ('dbo','meta')
and table_name in (select name from sys.tables)
order by TABLE_SCHEMA ,       TABLE_NAME ,ORDINAL_POSITION

resim açıklamasını buraya girin


3
Bu sadece karşılaştırma
yapmakla

Sadece burada bırakıp başkalarına yardımcı olur. Bana yardımcı oldu
Jeremy Thompson


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.