ตรวจจับและแก้ไขการเบี่ยงเบนของสคีมา
โครงการฐานข้อมูล SQL ของคุณระบุว่า Customers ตารางมี 12 คอลัมน์ การผลิตมี 13 มีคนเพิ่ม LoyaltyTier คอลัมน์โดยตรงผ่าน SQL Server Management Studio (SSMS) เมื่อวันพฤหัสบดีที่แล้วระหว่างเหตุการณ์ การปรับใช้ครั้งต่อไปของคุณจะทิ้งคอลัมน์นั้นอย่างเงียบ ๆ เนื่องจากโครงการไม่ทราบว่ามีอยู่จริง สถานการณ์ประเภทนี้เรียกว่าการดริฟท์สคีมา และเป็นวิธีหนึ่งที่ไปป์ไลน์ CI/CD ทําลายการผลิตโดยไม่มีการเตือนล่วงหน้า
ทําความเข้าใจการดริฟท์สคีมา
การดริฟท์สคีมาคือช่องว่างระหว่างสิ่งที่โครงการของคุณกําหนดและสิ่งที่มีอยู่จริงในฐานข้อมูลสด สาเหตุทั่วไป ได้แก่ :
-
การเปลี่ยนแปลงด้วยตนเอง: มีคนเปิดหน้าต่างคิวรีและเรียกใช้
ALTER TABLEเวิร์กโฟลว์ปกติภายนอก - โปรแกรมแก้ไขด่วนฉุกเฉิน: ปัญหาการผลิตได้รับการแก้ไขในเวลา 02.00 น. และการแก้ไขจะไม่กลับเข้าสู่โครงการ
- เครื่องมือของบุคคลที่สาม: เอเจนต์การตรวจสอบหรือเฟรมเวิร์ก Object-Relational Mapping (ORM) ที่สร้างหรือแก้ไขอ็อบเจ็กต์เบื้องหลัง
อันตรายไม่ใช่การล่องลอย มันคือสิ่งที่จะเกิดขึ้นต่อไป ไปป์ไลน์ของคุณปรับใช้ .dacpacSqlPackage คํานวณความแตกต่าง และทุกออบเจ็กต์ที่โครงการไม่ทราบจะถูกทิ้ง การตรวจจับการเบี่ยงเบนก่อนที่การปรับใช้จะทํางานเป็นสิ่งสําคัญ
ตรวจจับการดริฟท์ด้วยการเปรียบเทียบสคีมา
เครื่องมือเปรียบเทียบสคีมาช่วยให้คุณเก็บคําจํากัดความฐานข้อมูลสองรายการไว้เคียงข้างกัน คุณสามารถเปรียบเทียบการรวมกันของฐานข้อมูลสด โครงการฐานข้อมูล SQL หรือ .dacpac แฟ้ม เมื่อคุณเปรียบเทียบฐานข้อมูลที่ใช้งานจริงกับโครงการของคุณ ผลลัพธ์จะแสดงความแตกต่างทั้งหมด โดยจัดกลุ่มตามชนิดการดําเนินการ (Create, Alter, Delete) ด้วยคําจํากัดความต้นทางและเป้าหมายที่แสดงสําหรับแต่ละวัตถุ
ใน Visual Studio หรือ Visual Studio Code ให้เปิดใช้ schema compare จากเมนู SQL Server หรือมุมมองโครงการฐานข้อมูล ชี้แหล่งที่มาที่ฐานข้อมูลสดและเป้าหมายที่โครงการ ตารางเปรียบเทียบแสดงให้เห็นว่ามีอะไรแตกต่างและอะไรจะเปลี่ยนแปลงหากคุณนํามาจัดตําแหน่ง
Note
ทิศทางสามารถย้อนกลับได้ เปรียบเทียบฐานข้อมูลกับโครงการเพื่อค้นหาการดริฟท์ เปรียบเทียบโครงการกับฐานข้อมูลเพื่อดูตัวอย่างว่าการปรับใช้จะเปลี่ยนแปลงอะไร เครื่องมือเดียวกัน มุมมองตรงกันข้าม
ตัวเลือกการเปรียบเทียบสคีมา
ไม่ใช่ทุกความแตกต่างที่สําคัญ คุณสามารถปรับแต่งการเปรียบเทียบเพื่อมุ่งเน้นไปที่สิ่งที่มีความหมาย:
- ละเว้นช่องว่าง เพื่อข้ามความแตกต่างเฉพาะการจัดรูปแบบ
- ละเว้นลําดับคอลัมน์ เมื่อตําแหน่งคอลัมน์ไม่เกี่ยวข้องกับแอปพลิเคชันของคุณ
- บล็อกการสูญหายของข้อมูลที่อาจเกิดขึ้น เพื่อตั้งค่าสถานะการดําเนินการทําลายล้าง เช่น การทิ้งคอลัมน์ที่มีข้อมูล
บันทึกการตั้งค่าการเปรียบเทียบของคุณเป็น .scmp ไฟล์และส่งไปยังที่เก็บของคุณ มันจัดเก็บแหล่งที่มา เป้าหมาย ตัวเลือกการเปรียบเทียบ และประเภทวัตถุที่ยกเว้น ทําให้การตรวจสอบการดริฟท์สามารถทําซ้ําได้ทั่วทั้งทีม
นําเข้าการเปลี่ยนแปลงจากฐานข้อมูลไปยังโครงการ
เมื่อคุณพบการดริฟท์คุณต้องตัดสินใจว่าฐานข้อมูลสดมีเวอร์ชันที่ถูกต้องหรือโครงการหรือไม่ ถ้าโปรแกรมแก้ไขด่วนของการผลิตถูกต้อง ให้นํามาไว้ในโครงการเพื่อให้แหล่งข้อมูลของคุณถูกต้อง
ใช้การเปรียบเทียบสคีมาเพื่อใช้การเปลี่ยนแปลง
ในผลลัพธ์การเปรียบเทียบ ให้เลือกความแตกต่างเฉพาะที่คุณต้องการนําเข้าและนําไปใช้ อินเทอร์เฟซแบบกราฟิกใน Visual Studio และ Visual Studio Code ช่วยให้คุณเลือกเชอร์รี่ได้ ยอมรับดัชนีโปรแกรมแก้ไขด่วน แต่ละเว้นตารางชั่วคราวของตัวแทนการตรวจสอบ เป็นต้น
ทําให้เป็นอัตโนมัติด้วยการแยกข้อมูล SqlPackage
สําหรับสถานการณ์ CI/CD หรือการตรวจสอบการดริฟท์ตามกําหนดการ ให้ใช้ SqlPackage Extract เพื่อดึง Schema แบบสดลงในไฟล์:
sqlpackage /Action:Extract /SourceConnectionString:"{connection string}" /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType
📝 สิ่งนี้จะแยกวัตถุฐานข้อมูลลงในไฟล์ที่จัดเรียงตาม Schema และประเภทวัตถุ ด้วยโฟลเดอร์โครงการภายใต้ Git การเรียกใช้ git status หลังจากการแยกข้อมูลจะเปิดเผยว่าไฟล์ใดเปลี่ยนแปลง นั่นคือรายงานการดริฟท์อัตโนมัติของคุณ
คําสั่งสามคําสั่งให้จํานวนการดริฟท์แก่คุณ:
rm -rf MyDatabaseProject
sqlpackage /Action:Extract /SourceConnectionString:"{connection string}" /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType
git status --porcelain | wc -l
📝 ผลลัพธ์คือจํานวนไฟล์ที่เปลี่ยนแปลง ทําให้คุณนับการดริฟท์โดยอัตโนมัติ
ตรวจสอบการเปลี่ยนแปลงการปรับใช้ก่อนนําไปใช้
คุณเห็นการกระทําและScriptDeployReportในหน่วยก่อนหน้านี้เกี่ยวกับการสร้างและการปรับใช้ ในบริบทการตรวจจับการดริฟท์ คําสั่งเดียวกันนี้จะช่วยให้คุณตรวจสอบสิ่งที่ SqlPackage จะทําก่อนที่คุณจะเรียกใช้กับการผลิต
สร้างสคริปต์การปรับใช้
Scriptการดําเนินการจะสร้าง T-SQL ที่แน่นอนที่จะดําเนินการโดยไม่ต้องเรียกใช้จริง:
dotnet build MyProject.sqlproj
sqlpackage /Action:Script /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:"{connection string}" /DeployScriptPath:Deployment.sql
ตรวจสอบ Deployment.sql เพื่อดูทุก ALTER, CREATEและ DROP การปรับใช้จะดําเนินการ จัดเก็บสคริปต์เป็นสิ่งประดิษฐ์ไปป์ไลน์เพื่อขออนุมัติก่อนที่จะเรียกใช้กับการผลิต
สร้างรายงานการปรับใช้
DeployReportการดําเนินการสร้างสรุป XML ของการดําเนินงานที่วางแผนไว้:
sqlpackage /Action:DeployReport /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:"{connection string}" /OutputPath:report.xml
รายงานแสดงรายการการดําเนินการ เช่น Create, Alter, และ DropTableDataMotion แยกวิเคราะห์ XML ในไปป์ไลน์ของคุณเพื่อทริกเกอร์การแจ้งเตือนเกี่ยวกับเหตุการณ์ที่มีผลกระทบสูง เช่น การเคลื่อนไหวของข้อมูล การสร้างดัชนีใหม่แบบคลัสเตอร์ หรือการดรอปคอลัมน์:
<DeploymentReport xmlns="http://schemas.microsoft.com/sqlserver/dac/DeployReport/2012/02">
<Alerts />
<Operations>
<Operation Name="Create">
<Item Value="[dbo].[Products].[IX_Products_CategorySlug]" Type="SqlIndex" />
</Operation>
<Operation Name="Alter">
<Item Value="[dbo].[Customers]" Type="SqlTable" />
</Operation>
</Operations>
</DeploymentReport>
ตรวจสอบความสอดคล้องของ .dacpac ด้วย DacpacVerify
DacpacVerify เปรียบเทียบไฟล์สอง .dacpac ไฟล์และรายงานความแตกต่างระหว่างไฟล์เหล่านั้น รวมถึงสคริปต์ก่อนการปรับใช้ สคริปต์หลังการปรับใช้ ตัวแปร SQLCMD การอ้างอิงฐานข้อมูล คุณสมบัติ และวัตถุฐานข้อมูล การเปรียบเทียบนี้มีประโยชน์เมื่อแปลงจากโครงการ SQL Server Data Tools (SSDT) ดั้งเดิมเป็นสไตล์ SDK หรือเมื่อตรวจสอบความถูกต้องว่าไปป์ไลน์สร้างสิ่งประดิษฐ์ที่คาดไว้
ติดตั้งเป็นเครื่องมือส่วนกลาง .NET และเรียกใช้กับสอง .dacpac ไฟล์:
dotnet tool install -g microsoft.dacpacverify
dacpacverify before.dacpac after.dacpac
ประเด็นสําคัญ
การดริฟท์ Schema เกิดขึ้นเมื่อฐานข้อมูลสดแตกต่างจากโครงการ SQL ซึ่งมักเกิดจากโปรแกรมแก้ไขด่วน เครื่องมือเปรียบเทียบ Schema จะตรวจหาความแตกต่างระหว่างฐานข้อมูลและโครงการ ให้คุณเลือกการเปลี่ยนแปลงที่จะดึงเข้าสู่โครงการหรือส่งไปยังฐานข้อมูล บันทึกการตั้งค่าการเปรียบเทียบสคีมาใน .scmp ไฟล์เพื่อให้ทีมใช้ตัวเลือกที่สอดคล้องกันทุกครั้ง ทําให้การตรวจจับการดริฟท์เป็นแบบอัตโนมัติโดยเรียกใช้ SqlPackage /Action:Extract ตามกําหนดการและเปรียบเทียบโครงการที่แยกออกมากับที่เก็บ ใช้เพื่อSqlPackage /Action:DeployReportแสดงตัวอย่างทุก , ALTERที่วางแผนCREATEไว้ และDROPก่อนนําการเปลี่ยนแปลงไปใช้ เป้าหมายไม่ใช่เพื่อป้องกันการเบี่ยงเบนทั้งหมด แต่เพื่อตรวจพบตั้งแต่เนิ่นๆ และแก้ไขก่อนที่การปรับใช้ครั้งต่อไปของคุณจะเปลี่ยนโปรแกรมแก้ไขด่วนเป็นการย้อนกลับ ถัดไป คุณสร้างไปป์ไลน์ CI/CD ที่ทําให้วงจรการสร้างและปรับใช้ทั้งหมดเป็นแบบอัตโนมัติ