Bagaimana saya bisa membandingkan skema dua database?

19

Apakah ada cara untuk menemukan perbedaan dalam dua database SQL Server (hanya skema). Satu adalah lokal dan yang kedua di situs pelanggan. Kami mengalami masalah dengan laporan kristal yang menjalankan beberapa laporan dan beberapa kode tidak dieksekusi dan tampaknya skema tidak cocok.

Bisakah saya menjalankan perintah yang sama pada kedua database dan membandingkan hasilnya untuk mengetahui di mana perbedaannya?

pengguna1571430
sumber
Pertanyaan tentang SO ini memiliki beberapa saran bagus.
LowlyDBA

Jawaban:

13

Jika Anda tidak dapat menggunakan salah satu dari banyak alat di luar sana karena masalah konektivitas dan menginginkan perbandingan "offline", Anda dapat menggunakan SSMS untuk menghasilkan skrip untuk semua objek basis data dengan mengklik kanan pada basis data dan menggunakan "Tugas ... / Buat Script "berfungsi, dan pastikan Anda memilih untuk membuat satu file per objek.

Ketika Anda telah melakukan itu untuk kedua database, dapatkan dua set skrip ke mesin lokal di dua folder terpisah dan gunakan WinMerge (atau serupa) untuk membandingkan keduanya.

Tuan Magoo
sumber
6

Pilihan lain adalah menggunakan SQL Server Data Tools (SSDT), perpanjangan dari Visual Studio. Anda bisa mengekstrak skema basis data Anda sebagai file .dacpac dan membandingkannya dengan file .dacpac lain atau database yang sudah ada. SSDT disertakan dengan alat klien SQL Server 2012, membuatnya cukup mudah diakses. Anda dapat menemukan petunjuk lengkap tentang cara menjalankan perbandingan di situs MSDN .

Mike Fal
sumber
6

Setelah berjuang dengan cara mudah untuk melakukan tugas yang sama ini - lihat apa yang berubah di antara 2 model, saya menulis SQL Script berikut yang akan membandingkan dua skema untuk menentukan kolom baru dan yang dihapus

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
John Adams
sumber
Untuk solusi cepat dan kotor yang tidak memerlukan perangkat lunak tambahan, ini luar biasa! Persis seperti yang saya butuhkan. Terima kasih!
Mir
2

Jika Anda perlu membandingkan lebih dari satu file database Anda dapat skrip SQLPackage.exe.

Saya tidak memiliki kode yang berfungsi untuk Anda, tetapi Anda bisa melihat dokumentasi SQLPackage.exe untuk beberapa inspirasi.

Anda akan mengekstrak database master Anda ke file dacpac dan kemudian membandingkan file dacpac dengan seluruh database Anda. Hasil perbandingan bisa berupa laporan xml dari perubahan atau file .sql yang dapat Anda jalankan untuk menyinkronkan basis data.

Sesuatu seperti ini:

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

lalu

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 

Anda dapat melihat artikel ini atau kode sampel ini.

Tom V - Tim Monica
sumber
1

Lakukan pencarian untuk "SQL Server Bandingkan" dan Anda akan menemukan banyak alat. Yang kami gunakan di pekerjaan saya adalah Red Gate SQLCompare . Ini memiliki uji coba 14 hari. Tetapi karena Anda berbicara tentang dua lingkungan yang berbeda, saya tidak berpikir itu akan berhasil untuk Anda, kecuali jika klien mengirimi Anda cadangan DB mereka. Opsi lainnya adalah menulis kueri terhadap tabel sistem (seperti sys.indexes, sys.tables, dll).

Chris Woods
sumber
SQL Compare berfungsi dengan baik jika Anda memiliki login ke kedua server. Anda dapat menggunakan login yang berbeda untuk setiap DB, sehingga klien harus memastikan Anda memiliki akses.
Mark Sinkinson
1

Cara termudah adalah dengan menggunakan alat otomatis yang dibangun untuk tujuan ini , tetapi jika Anda tidak memiliki akses ke sana, Anda bisa mendapatkan semua informasi dasar yang Anda butuhkan dari INFORMATION_SCHEMApandangan.

Menggunakan metadata di INFORMATION_SCHEMAmungkin merupakan opsi yang lebih mudah daripada menghasilkan skrip DDL dan melakukan perbandingan sumber karena Anda memiliki kontrol lebih besar atas bagaimana data disajikan. Anda tidak dapat benar-benar mengontrol urutan skrip yang dihasilkan akan menyajikan objek dalam database. Juga, skrip berisi banyak teks yang mungkin tergantung implementasi secara default dan dapat menyebabkan banyak "noise" yang tidak cocok ketika Anda mungkin benar-benar perlu fokus adalah tabel, tampilan atau kolom yang hilang, atau mungkin tipe data kolom atau ukuran tidak cocok.

Tulis kueri (atau kueri) untuk mendapatkan informasi yang penting bagi kode Anda dari INFORMATION_SCHEMAtampilan dan jalankan pada setiap SQL Server dari SSMS. Anda kemudian dapat membuang hasil ke file dan menggunakan alat membandingkan file teks (bahkan MS Word) atau Anda dapat membuang hasilnya ke tabel dan menjalankan query SQL untuk menemukan ketidakcocokan.

Joel Brown
sumber
1

Saya menyertakan jawaban ini demi pertanyaan baru yang ditandai sebagai duplikat.

Saya pernah harus membandingkan dua basis data produksi dan menemukan perbedaan skema di antara mereka. Satu-satunya item yang menarik adalah tabel yang telah ditambahkan atau dijatuhkan dan kolom yang telah ditambahkan, dihapus, atau diubah. Saya tidak lagi memiliki skrip SQL yang saya kembangkan, tetapi yang berikut adalah strategi umum. Dan database itu bukan SQL Server, tapi saya pikir strategi yang sama berlaku.

Pertama, saya membuat apa yang bisa digambarkan sebagai metadatabase. Tabel pengguna dari database ini berisi deskripsi data yang disalin dari tabel sistem database produksi. Hal-hal seperti Nama Tabel, Nama Kolom, Jenis Data, dan Presisi. Ada satu item lagi, Nama Basis Data, yang tidak ada di salah satu dari basis data produksi.

Selanjutnya, saya mengembangkan skrip yang digabungkan memilih dari tabel sistem dari database produksi dengan memasukkan ke dalam tabel pengguna metadatabase.

Akhirnya, saya mengembangkan kueri untuk menemukan tabel yang ada di satu database tetapi tidak yang lain, dan kolom dari tabel di kedua database yang hanya ada di satu database, dan kolom dengan definisi yang tidak konsisten antara kedua database.

Dari sekitar 100 tabel dan 600 kolom, saya menemukan beberapa ketidakkonsistenan, dan satu kolom yang didefinisikan sebagai titik apung di satu basis data dan bilangan bulat di yang lain. Yang terakhir ternyata menjadi anugerah, karena menggali masalah yang telah mengganggu salah satu database selama bertahun-tahun.

Model untuk metadatabase disarankan oleh tabel sistem yang dimaksud. Kueri tidak sulit untuk dibangun, sebagian besar berputar di sekitar grup dengan dan memiliki hitungan (nama database) = 1.

Dalam kasus Anda, dengan 700 basis data produksi, Anda mungkin ingin mengotomatiskan dua langkah pertama lebih dari yang saya lakukan dengan hanya dua basis data untuk membandingkan. Tapi idenya serupa.

Walter Mitty
sumber
1

Saya punya pertanyaan yang sama persis dan saya percaya bahwa Microsoft SQL Server Management Studio (SSMS) memiliki solusi yang jauh lebih mudah / sederhana daripada apa pun yang saya lihat di sini. Saya memiliki situs produksi dengan MS SQL Server Express dan segera menjadi beberapa tempat di mana saya tidak ingin menginstal VisualStudio atau aplikasi lain selain SSMS.

Jadi dalam SSMS, klik kanan pada database untuk mendapatkan skema. Pilih Tugas> Buat Skrip ... untuk membuka wizard untuk skrip skema dan konfigurasi untuk seluruh database (atau objek yang dipilih jika Anda mau). Saya menyimpan semua opsi default kecuali path / nama file, tetapi alat ini memiliki banyak pilihan. Wisaya membuat satu SQL yang saya salin melalui OneDrive kembali ke PC saya. Saya kemudian menggunakan Notepad ++ untuk membandingkan SQL dengan file yang dihasilkan dengan cara yang sama terhadap database SIT saya. Anda harus memfilter hit dari tanggal / waktu dalam komentar, tetapi sebaliknya itu adalah perbandingan yang bagus dari kedua database.

Presto! Menulis ini secara signifikan lebih sulit daripada melakukan perbandingan yang sebenarnya.

RBrown
sumber
0

Alat hebat yang saya gunakan (meskipun tidak diperbarui dalam beberapa saat masih berfungsi) adalah AdeptSqlDiff

Apakah kedua skema membandingkan serta perbandingan data. Sama seperti RedGate ada biaya tetapi juga uji coba 30 hari. Dan harganya cukup masuk akal.

TombMedia
sumber
0

Mungkin skrip gratis ini https://github.com/dlevsha/compalex dapat membantu Anda. Ini mendukung Microsoft SQL Server.

Compalex adalah skrip ringan gratis untuk membandingkan dua skema basis data. Ini mendukung MySQL, MS SQL Server dan PostgreSQL.

Anda dapat mencoba demo di sini

http://demo.compalex.net/

DLevsha
sumber
0

Ada banyak alat pihak ketiga di luar sana yang akan melakukan skema dan membandingkan data, dan sinkronisasi. Dua alat yang dapat Anda gunakan adalah yang dikembangkan oleh tim saya dan saya, xSQL Schema Compare untuk perbandingan skema dan xSQL Data Compare untuk perbandingan data antara objek dengan skema yang sama. Semoga ini membantu!
Penafian: Saya berafiliasi dengan xSQL

Endi Zhupani
sumber
0

Ada banyak alat di pasar yang mungkin Anda gunakan untuk menyelesaikan pekerjaan. Perusahaan saya menggunakan ApexSQL Diff untuk perbandingan dan sinkronisasi karena gratis untuk Azure, tetapi Anda tidak dapat salah dengan alat Devart atau Redgate.

Mspaja
sumber
0

Saya penggemar SQL DBDiff , yang merupakan alat open source yang dapat Anda gunakan untuk membandingkan tabel, tampilan, fungsi, pengguna, dll. Dari dua contoh database SQL Server dan menghasilkan skrip perubahan antara sumber dan tujuan database.

Shridhar
sumber
0

Saya telah membuat utilitas MssqlMerge yang memungkinkan untuk membandingkan basis data MSSQL, baik struktur maupun data. Ada versi gratis yang tersedia yang memungkinkan untuk membandingkan definisi tabel, tampilan, prosedur dan fungsi yang tersimpan. Dan juga ada versi Pro yang mendukung lebih banyak jenis objek dan memiliki fitur 'Query result diff' di mana Anda dapat menjalankan dan membandingkan hasil kueri, termasuk permintaan terhadap tampilan sistem, untuk membandingkan beberapa detail lain yang tidak tersedia di luar kotak.

sarh
sumber
-1

Lihat ini:

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

masukkan deskripsi gambar di sini

Jeremy Thompson
sumber
3
Ini benar-benar perlu tentang membandingkan, tidak hanya mendapatkan skema
Mark Sinkinson
Saya hanya akan membiarkannya di sini membungkusnya membantu orang lain. Itu membantu saya
Jeremy Thompson
-1

Saya menggunakan alat gratis (dan sumber terbuka) ini: OpenDBDiff

Tommy
sumber
-1

DBDiff adalah alat terbaik untuk ini, Anda dapat menemukannya di sini .

levisaligue
sumber
Selamat datang di Administrator Database! Seperti yang Anda lihat, semua jawaban yang diterima dengan baik di sini lebih dari sekadar tautan . Silakan pertimbangkan untuk mengedit jawaban Anda dan menambahkan lebih banyak informasi tentang perangkat lunak, terutama bagaimana memenuhi persyaratan dalam pertanyaan.
Glorfindel