ฉันจะเปรียบเทียบสคีมาของฐานข้อมูลทั้งสองได้อย่างไร


19

มีวิธีการค้นหาความแตกต่างในสองฐานข้อมูล SQL Server (schema เท่านั้น) หนึ่งคือท้องถิ่นและที่สองคือที่เว็บไซต์ของลูกค้า เรากำลังประสบปัญหากับรายงานแบบคริสตัลที่เรียกใช้รายงานบางส่วนและบางรหัสไม่ทำงานและดูเหมือนว่าสคีมาไม่ตรงกัน

ฉันสามารถรันคำสั่งเดียวกันบนฐานข้อมูลทั้งสองและเปรียบเทียบผลลัพธ์เพื่อบอกความแตกต่างได้หรือไม่


คำถามเกี่ยวกับ SO นี้มีคำแนะนำที่ดี
LowlyDBA

คำตอบ:


13

หากคุณไม่สามารถใช้หนึ่งในหลาย ๆ เครื่องมือเพราะปัญหาการเชื่อมต่อและต้องการเปรียบเทียบ "ออฟไลน์" คุณสามารถใช้ SSMS เพื่อสร้างสคริปต์สำหรับวัตถุฐานข้อมูลทั้งหมดโดยคลิกขวาที่ฐานข้อมูลและใช้ "งาน ... / สร้าง ฟังก์ชัน "สคริปต์และตรวจสอบให้แน่ใจว่าคุณเลือกที่จะสร้างหนึ่งไฟล์ต่อวัตถุ

เมื่อคุณทำเช่นนั้นสำหรับฐานข้อมูลทั้งสองให้รับสคริปต์สองชุดลงบนเครื่องโลคัลในสองโฟลเดอร์แยกกันและใช้ WinMerge (หรือคล้ายกัน) เพื่อเปรียบเทียบทั้งสอง


6

อีกตัวเลือกหนึ่งคือการใช้ SQL Server Data Tools (SSDT) ​​ซึ่งเป็นส่วนเสริมของ Visual Studio คุณสามารถแตกสกีมาฐานข้อมูลของคุณเป็นไฟล์. dacpac และเปรียบเทียบกับไฟล์. dacpac อื่นหรือฐานข้อมูลที่มีอยู่ SSDT มาพร้อมกับเครื่องมือไคลเอนต์ SQL Server 2012 ทำให้เข้าถึงได้ง่าย คุณสามารถค้นหาคำแนะนำเต็มรูปแบบของวิธีการเรียกใช้เปรียบเทียบในเว็บไซต์ MSDN


6

หลังจากดิ้นรนกับวิธีง่าย ๆ ในการทำงานนี้ - ดูว่ามีอะไรเปลี่ยนแปลงระหว่าง 2 รุ่นฉันเขียน SQL Script ต่อไปนี้ซึ่งจะเปรียบเทียบ schema สองตัวเพื่อกำหนดคอลัมน์ใหม่และลบ

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

สำหรับวิธีการแก้ปัญหาที่รวดเร็วและสกปรกที่ไม่ต้องใช้ซอฟต์แวร์เพิ่มเติมนี่เป็นสิ่งที่ยอดเยี่ยม! มันเป็นสิ่งที่ฉันต้องการ ขอบคุณ!
เมียร์

2

SQLPackage.exeหากคุณต้องการที่จะเปรียบเทียบไฟล์ฐานข้อมูลมากกว่าหนึ่งคุณสามารถสคริปต์

ฉันไม่มีรหัสที่ทำงานให้คุณ แต่คุณสามารถดูเอกสาร SQLPackage.exeเพื่อหาแรงบันดาลใจบางอย่าง

คุณจะแตกฐานข้อมูลหลักของคุณเป็นไฟล์ dacpac จากนั้นเปรียบเทียบไฟล์ dacpac กับฐานข้อมูลส่วนที่เหลือของคุณ ผลลัพธ์ของการเปรียบเทียบอาจเป็นรายงาน xml ของการเปลี่ยนแปลงหรือไฟล์. sql ที่คุณสามารถเรียกใช้เพื่อซิงโครไนซ์ฐานข้อมูล

บางสิ่งเช่นนี้

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

แล้ว

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 

คุณสามารถดูบทความนี้หรือรหัสนี้สำหรับตัวอย่าง


1

ค้นหา "SQL Server Compare" แล้วคุณจะพบเครื่องมือมากมาย หนึ่งที่เราใช้ในงานของฉันคือประตูสีแดง SQLCompare มีการทดลองใช้ 14 วัน แต่เนื่องจากคุณกำลังพูดถึงสองสภาพแวดล้อมที่แตกต่างกันฉันไม่คิดว่ามันจะทำงานให้คุณเว้นแต่ว่าลูกค้าจะส่งข้อมูลสำรองให้กับฐานข้อมูลของคุณ ตัวเลือกอื่นคือการเขียนแบบสอบถามกับตารางระบบ (เช่น sys.indexes, sys.tables ฯลฯ )


SQL Compare ทำงานได้ดีถ้าคุณมีการล็อกอินไปยังเซิร์ฟเวอร์ทั้งสอง คุณสามารถใช้การเข้าสู่ระบบที่แตกต่างกันไปยังแต่ละฐานข้อมูลดังนั้นลูกค้าจะต้องให้แน่ใจว่าคุณมีการเข้าถึง
Mark Sinkinson

1

วิธีที่ง่ายที่สุดคือการใช้เครื่องมืออัตโนมัติที่สร้างขึ้นเพื่อจุดประสงค์นี้แต่ถ้าคุณไม่สามารถเข้าถึงได้คุณสามารถรับข้อมูลพื้นฐานทั้งหมดที่คุณต้องการจากINFORMATION_SCHEMAมุมมองได้

การใช้ข้อมูลเมตาในINFORMATION_SCHEMAอาจเป็นตัวเลือกที่ง่ายกว่าการสร้างสคริปต์ DDL และทำการเปรียบเทียบแหล่งข้อมูลเนื่องจากคุณสามารถควบคุมวิธีการนำเสนอข้อมูลได้มากขึ้น คุณไม่สามารถควบคุมลำดับที่สคริปต์ที่สร้างขึ้นจะแสดงวัตถุในฐานข้อมูล นอกจากนี้สคริปต์ยังมีข้อความจำนวนมากที่อาจนำไปใช้งานตามค่าเริ่มต้นและอาจทำให้เกิด "สัญญาณรบกวน" ไม่ตรงกันเมื่อสิ่งที่คุณอาจต้องให้ความสำคัญจริง ๆ คือตารางมุมมองหรือคอลัมน์ที่ขาดหายไปหรืออาจเป็นประเภทข้อมูลคอลัมน์ หรือขนาดไม่ตรงกัน

เขียนแบบสอบถาม (หรือแบบสอบถาม) เพื่อรับข้อมูลที่เกี่ยวข้องกับรหัสของคุณจากINFORMATION_SCHEMAมุมมองและเรียกใช้ในแต่ละเซิร์ฟเวอร์ SQL จาก SSMS จากนั้นคุณสามารถถ่ายโอนข้อมูลผลลัพธ์ไปยังไฟล์และใช้เครื่องมือเปรียบเทียบไฟล์ข้อความ (แม้แต่ MS Word) หรือคุณสามารถถ่ายโอนผลลัพธ์ไปยังตารางและเรียกใช้แบบสอบถาม SQL เพื่อค้นหาคำที่ไม่ตรงกัน


1

ฉันรวมคำตอบนี้เพื่อประโยชน์ของคำถามใหม่ที่ถูกทำเครื่องหมายว่าซ้ำซ้อน

ฉันเคยต้องเปรียบเทียบฐานข้อมูลการผลิตสองฐานและค้นหาความแตกต่างระหว่างสคีมา รายการที่น่าสนใจเพียงอย่างเดียวคือตารางที่เพิ่มหรือลดลงและคอลัมน์ที่เพิ่มลบหรือเปลี่ยนแปลง ฉันไม่มีสคริปต์ SQL ที่ฉันพัฒนาอีกต่อไป แต่สิ่งที่ตามมาคือกลยุทธ์ทั่วไป และฐานข้อมูลไม่ใช่ SQL Server แต่ฉันคิดว่าใช้กลยุทธ์เดียวกัน

ก่อนอื่นฉันสร้างสิ่งที่สามารถอธิบายได้ดีที่สุดเป็นฐานข้อมูล ตารางผู้ใช้ของฐานข้อมูลนี้มีคำอธิบายข้อมูลที่คัดลอกมาจากตารางระบบของฐานข้อมูลการผลิต สิ่งต่างๆเช่นชื่อตารางชื่อคอลัมน์ประเภทข้อมูลและความแม่นยำ มีอีกหนึ่งรายการชื่อฐานข้อมูลที่ไม่มีอยู่ในฐานข้อมูลการผลิตอย่างใดอย่างหนึ่ง

ต่อไปฉันพัฒนาสคริปต์ที่เลือกจากตารางระบบของฐานข้อมูลการผลิตพร้อมกับแทรกลงในตารางผู้ใช้ของฐานข้อมูล

ในที่สุดฉันก็พัฒนาคิวรี่เพื่อค้นหาตารางที่มีอยู่ในฐานข้อมูลหนึ่ง แต่ไม่รวมถึงอีกคอลัมน์หนึ่งและคอลัมน์จากตารางในฐานข้อมูลทั้งสองที่อยู่ในฐานข้อมูลเดียวเท่านั้นและคอลัมน์ที่มีคำจำกัดความที่ไม่สอดคล้องกันระหว่างฐานข้อมูลทั้งสอง

จากประมาณ 100 ตารางและ 600 คอลัมน์ฉันพบความไม่สอดคล้องกันจำนวนหนึ่งและหนึ่งคอลัมน์ที่ถูกกำหนดให้เป็นทศนิยมในฐานข้อมูลหนึ่งและจำนวนเต็มอีกตัวหนึ่ง อันสุดท้ายกลายเป็นสวรรค์เพราะมันค้นพบปัญหาที่ทำให้เกิดฐานข้อมูลหนึ่งในหลายปีที่ผ่านมา

แบบจำลองสำหรับฐานข้อมูลถูกแนะนำโดยตารางระบบที่เป็นปัญหา แบบสอบถามไม่ยากที่จะสร้างหมุนรอบกลุ่มโดยมีและนับ (ชื่อฐานข้อมูล) = 1

ในกรณีของคุณด้วยฐานข้อมูลการผลิต 700 รายการคุณอาจต้องการทำให้สองขั้นตอนแรกโดยอัตโนมัติมากกว่าที่ฉันทำด้วยการเปรียบเทียบเพียงสองฐานข้อมูล แต่ความคิดก็คล้ายกัน


1

ฉันมีคำถามเดียวกันนี้อย่างแน่นอนและฉันเชื่อว่า Microsoft SQL Server Management Studio (SSMS) มีโซลูชันที่ง่ายกว่า / ง่ายกว่าที่ฉันเห็นที่นี่ ฉันมีไซต์ที่ใช้งานกับ MS SQL Server Express และอีกไม่นานฉันก็จะต้องติดตั้ง VisualStudio หรือแอปพลิเคชั่นอื่นนอกเหนือจาก SSMS

ดังนั้นภายใน SSMS ให้คลิกขวาที่ฐานข้อมูลเพื่อรับสคีมา เลือกงาน> สร้างสคริปต์ ...เพื่อเปิดตัวช่วยสร้างเพื่อเขียนสคริปต์สกีมาและการกำหนดค่าสำหรับฐานข้อมูลทั้งหมด (หรือวัตถุที่เลือกหากคุณต้องการ) ฉันเก็บตัวเลือกเริ่มต้นทั้งหมดยกเว้นเส้นทาง / ชื่อไฟล์ แต่เครื่องมือมีตัวเลือกมากมายเหลือเฟือ ตัวช่วยสร้างสร้างหนึ่ง SQL ซึ่งฉันคัดลอกผ่าน OneDrive กลับไปยังพีซีของฉัน ฉันใช้ Notepad ++ เพื่อเปรียบเทียบ SQL กับไฟล์ที่สร้างในลักษณะเดียวกันกับฐานข้อมูล SIT ของฉัน คุณต้องกรองความนิยมจากวันที่ / เวลาในความคิดเห็น แต่ไม่เช่นนั้นเป็นการเปรียบเทียบที่ดีของฐานข้อมูลทั้งสอง

โอมเพี้ยง! การเขียนสิ่งนี้ยากกว่าการเปรียบเทียบจริง


0

เครื่องมือที่ยอดเยี่ยมที่ฉันใช้ (แม้ว่าจะไม่ได้รับการปรับปรุงในขณะที่ยังใช้งานได้) คือAdeptSqlDiff

สคีมาทั้งคู่ทำการเปรียบเทียบและเปรียบเทียบข้อมูลหรือไม่ เช่นเดียวกับ RedGate มีค่าใช้จ่าย แต่ยังมีการทดลองใช้ 30 วัน และราคาค่อนข้างสมเหตุสมผล


0

บางทีสคริปต์ฟรีนี้https://github.com/dlevsha/compalexสามารถช่วยคุณได้ รองรับ Microsoft SQL Server

Compalex เป็นสคริปต์น้ำหนักเบาฟรีเพื่อเปรียบเทียบสกีมาฐานข้อมูลสองรายการ รองรับ MySQL, MS SQL Server และ PostgreSQL

คุณสามารถลองตัวอย่างได้ที่นี่

http://demo.compalex.net/


0

มีเครื่องมือของบุคคลที่สามอยู่มากมายซึ่งจะทำสคีมาและข้อมูลเปรียบเทียบและการซิงโครไนซ์ เครื่องมือสองอย่างที่คุณสามารถใช้ได้คือเครื่องมือของฉันและฉันได้พัฒนา, xSQL Schema เปรียบเทียบสำหรับการเปรียบเทียบ schema และxSQL Data เปรียบเทียบสำหรับการเปรียบเทียบข้อมูลระหว่างวัตถุที่มีสคีมาเดียวกัน หวังว่านี่จะช่วยได้!
ข้อจำกัดความรับผิดชอบ: ฉันเข้าร่วมกับ xSQL


0

มีเครื่องมือมากมายในท้องตลาดที่คุณอาจใช้เพื่อทำงานให้สำเร็จลุล่วง บริษัท ของฉันใช้ApexSQL Diffสำหรับการเปรียบเทียบและการซิงก์เพราะฟรีสำหรับ Azure แต่คุณไม่สามารถผิดพลาดได้ด้วยเครื่องมือ Devart หรือ Redgate


0

ฉันเป็นแฟนตัวยงของSQL DBDiffซึ่งเป็นเครื่องมือโอเพ่นซอร์สที่คุณสามารถใช้เพื่อเปรียบเทียบตารางมุมมองฟังก์ชันผู้ใช้ ฯลฯ ของฐานข้อมูล SQL Server สองอินสแตนซ์และสร้างสคริปต์การเปลี่ยนแปลงระหว่างฐานข้อมูลต้นทางและปลายทาง


0

ฉันได้สร้างโปรแกรมอรรถประโยชน์MssqlMergeที่ช่วยเปรียบเทียบฐานข้อมูล MSSQL ทั้งโครงสร้างและข้อมูล มีรุ่นฟรีให้ใช้เพื่อเปรียบเทียบคำจำกัดความของตารางมุมมองโพรซีเดอร์และฟังก์ชันที่เก็บไว้ นอกจากนี้ยังมีรุ่น Pro ที่รองรับประเภทวัตถุมากขึ้นและมีคุณสมบัติ 'ผลการสืบค้นที่แตกต่างกัน' ซึ่งคุณสามารถเรียกใช้และเปรียบเทียบผลการสืบค้นใด ๆ รวมถึงการสอบถามกับมุมมองระบบเพื่อเปรียบเทียบรายละเอียดอื่น ๆ ที่ไม่มีในกล่อง


-1

ลองดู:

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

ป้อนคำอธิบายรูปภาพที่นี่


3
สิ่งนี้จะต้องเกี่ยวกับการเปรียบเทียบไม่ใช่แค่การทำให้สคีมา
Mark Sinkinson

ฉันจะทิ้งมันไว้ที่นี่เพราะมันช่วยคนอื่นได้ มันช่วยฉันได้
Jeremy Thompson


-1

DBDiff เป็นเครื่องมือที่ดีที่สุดสำหรับการนี้คุณสามารถค้นหาได้ที่นี่


ยินดีต้อนรับสู่ผู้ดูแลฐานข้อมูล! ที่คุณเห็นทุกคำตอบที่ดีที่ได้รับที่นี่มีมากกว่าเพียงแค่การเชื่อมโยง โปรดพิจารณาแก้ไขคำตอบของคุณและเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับซอฟต์แวร์โดยเฉพาะอย่างยิ่งว่าเป็นไปตามข้อกำหนดในคำถาม
Glorfindel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.