ตรวจจับและแก้ไขการเบี่ยงเบนของสคีมา

เสร็จสมบูรณ์เมื่อ

โครงการฐานข้อมูล 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 ที่ทําให้วงจรการสร้างและปรับใช้ทั้งหมดเป็นแบบอัตโนมัติ