Phát hiện và giải quyết sự trôi dạt lược đồ
Dự án cơ sở dữ liệu SQL của bạn cho biết Customers bảng có 12 cột. Sản xuất có 13. Ai đó đã thêm một LoyaltyTier cột trực tiếp thông qua SQL Server Management Studio (SSMS) vào thứ Năm tuần trước trong một sự cố. Lần triển khai tiếp theo của bạn sẽ lặng lẽ bỏ cột đó vì dự án không biết nó tồn tại. Loại tình huống này được gọi là schema drift và đó là một trong những cách CI/CD pipeline phá vỡ sản xuất mà không có cảnh báo.
Hiểu về độ lệch lược đồ
Schema drift là khoảng cách giữa những gì dự án của bạn xác định và những gì thực sự tồn tại trong cơ sở dữ liệu trực tiếp. Các nguyên nhân phổ biến bao gồm:
-
Thay đổi thủ công: ai đó mở cửa sổ truy vấn và chạy bên
ALTER TABLEngoài quy trình làm việc bình thường. - Các bản sửa lỗi khẩn cấp: sự cố sản xuất được vá vào lúc 2 giờ sáng và bản sửa lỗi không bao giờ được đưa trở lại dự án.
- Các công cụ của bên thứ ba: các tác nhân giám sát hoặc khung ánh xạ Object-Relational (ORM) tạo hoặc sửa đổi các đối tượng đằng sau hậu trường.
Nguy hiểm không phải là bản thân sự trôi dạt. Đó là những gì xảy ra tiếp theo. Quy trình của bạn triển khai , .dacpacSqlPackage tính toán sự khác biệt và mọi đối tượng mà dự án không biết sẽ bị loại bỏ. Phát hiện trôi trước khi triển khai chạy là rất quan trọng.
Phát hiện trôi dạt bằng so sánh lược đồ
Các công cụ so sánh lược đồ cho phép bạn giữ hai định nghĩa cơ sở dữ liệu cạnh nhau. Bạn có thể so sánh bất kỳ sự kết hợp nào của cơ sở dữ liệu trực tiếp, dự án cơ sở dữ liệu SQL hoặc tệp .dacpac . Khi bạn so sánh cơ sở dữ liệu trực tiếp với dự án của mình, kết quả sẽ hiển thị mọi sự khác biệt, được nhóm theo loại hành động (Create, Alter, Delete) với định nghĩa nguồn và đích được hiển thị cho từng đối tượng.
Trong Visual Studio hoặc Visual Studio Code, khởi chạy so sánh lược đồ từ menu SQL Server hoặc dạng xem Dự án Cơ sở dữ liệu. Trỏ nguồn tại cơ sở dữ liệu trực tiếp và mục tiêu tại dự án. Lưới so sánh cho thấy những gì khác biệt và những gì sẽ thay đổi nếu bạn đưa chúng vào căn chỉnh.
Lưu ý
Hướng có thể đảo ngược. So sánh cơ sở dữ liệu với dự án để tìm độ trôi. So sánh dự án với cơ sở dữ liệu để xem trước những gì triển khai sẽ thay đổi. Cùng một công cụ, phối cảnh ngược lại.
Các tùy chọn so sánh lược đồ
Không phải mọi sự khác biệt đều quan trọng. Bạn có thể điều chỉnh so sánh để tập trung vào những gì có ý nghĩa:
- Bỏ qua khoảng trắng để bỏ qua sự khác biệt chỉ về định dạng.
- Bỏ qua thứ tự cột khi vị trí cột không liên quan đến ứng dụng của bạn.
- Chặn dữ liệu có thể bị mất để gắn cờ các hoạt động phá hoại như bỏ các cột chứa dữ liệu.
Lưu cài đặt so sánh của bạn dưới dạng .scmp tệp và cam kết nó vào kho lưu trữ của bạn. Nó lưu trữ nguồn, đích, tùy chọn so sánh và các loại đối tượng bị loại trừ, giúp kiểm tra trôi có thể lặp lại trong nhóm.
Nhập các thay đổi từ cơ sở dữ liệu vào dự án
Khi bạn phát hiện ra sự trôi dạt, bạn cần quyết định: cơ sở dữ liệu trực tiếp có phiên bản phù hợp hay dự án? Nếu hotfix của sản xuất là đúng, hãy đưa nó vào dự án để nguồn tin cậy của bạn luôn chính xác.
Sử dụng so sánh lược đồ để áp dụng các thay đổi
Trong kết quả so sánh, hãy chọn sự khác biệt cụ thể mà bạn muốn nhập và áp dụng chúng. Giao diện đồ họa trong Visual Studio và Visual Studio Code cho phép bạn lựa chọn. Chấp nhận chỉ mục hotfix nhưng bỏ qua bảng tạm thời của tác nhân giám sát, ví dụ.
Tự động hóa với SqlPackage Extract
Đối với các kịch bản CI/CD hoặc kiểm tra trôi theo lịch trình, hãy sử dụng SqlPackage Extract để kéo lược đồ trực tiếp vào các tệp:
sqlpackage /Action:Extract /SourceConnectionString:"{connection string}" /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType
📝 Thao tác này trích xuất các đối tượng cơ sở dữ liệu vào các tệp được sắp xếp theo lược đồ và loại đối tượng. Với thư mục dự án trong Git, chạy git status sau khi giải nén sẽ hiển thị chính xác tệp nào đã thay đổi. Đó là báo cáo trôi tự động của bạn.
Ba lệnh cung cấp cho bạn số lần trôi dạt:
rm -rf MyDatabaseProject
sqlpackage /Action:Extract /SourceConnectionString:"{connection string}" /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType
git status --porcelain | wc -l
📝 Đầu ra là số lượng tệp đã thay đổi, cung cấp cho bạn số lượng trôi tự động.
Xem lại các thay đổi triển khai trước khi áp dụng
Bạn đã thấy các Script hành động và DeployReport trong đơn vị trước đó về việc xây dựng và triển khai. Trong ngữ cảnh phát hiện trôi, các lệnh tương tự này giúp bạn xác minh những gì SqlPackage sẽ làm trước khi bạn chạy nó so với sản xuất.
Tạo tập lệnh triển khai
Hành động này Script tạo ra T-SQL chính xác sẽ thực thi, mà không thực sự chạy nó:
dotnet build MyProject.sqlproj
sqlpackage /Action:Script /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:"{connection string}" /DeployScriptPath:Deployment.sql
Xem lại Deployment.sql để xem mọi , CREATEALTERvà DROP việc triển khai sẽ thực thi. Lưu trữ tập lệnh dưới dạng cấu phần phần mềm quy trình để phê duyệt trước khi chạy tập lệnh so với bản sản xuất.
Tạo báo cáo triển khai
Hành động này DeployReport tạo ra một bản tóm tắt XML về các hoạt động đã lên kế hoạch:
sqlpackage /Action:DeployReport /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:"{connection string}" /OutputPath:report.xml
Báo cáo liệt kê các hoạt động như Create, Alter, và TableDataMotionDrop. Phân tích cú pháp XML trong quy trình của bạn để kích hoạt cảnh báo về các sự kiện có tác động lớn như chuyển động dữ liệu, xây dựng lại chỉ mục theo cụm hoặc giảm cột:
<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>
Xác minh tính nhất quán của .dacpac với DacpacVerify
DacpacVerify so sánh hai .dacpac tệp và báo cáo sự khác biệt giữa chúng, bao gồm các tập lệnh trước khi triển khai, tập lệnh sau triển khai, biến SQLCMD, tham chiếu cơ sở dữ liệu, thuộc tính và đối tượng cơ sở dữ liệu. So sánh này hữu ích khi chuyển đổi từ dự án SQL Server Data Tools (SSDT) gốc sang kiểu SDK hoặc khi xác thực rằng một quy trình tạo ra cấu phần phần mềm dự kiến.
Cài đặt nó như một công cụ toàn cầu .NET và chạy nó trên hai .dacpac tệp:
dotnet tool install -g microsoft.dacpacverify
dacpacverify before.dacpac after.dacpac
Khóa takeaways
Trôi lược đồ xảy ra khi cơ sở dữ liệu trực tiếp tách ra khỏi dự án SQL, thường do các bản sửa lỗi nóng, thay đổi thủ công hoặc chỉnh sửa sản xuất trực tiếp. Các công cụ so sánh lược đồ phát hiện sự khác biệt giữa cơ sở dữ liệu và dự án, cho phép bạn chọn thay đổi nào để kéo vào dự án hoặc đẩy vào cơ sở dữ liệu. Lưu cài đặt so sánh lược đồ trong .scmp tệp để nhóm sử dụng các tùy chọn nhất quán mọi lúc. Tự động phát hiện trôi bằng cách chạy SqlPackage /Action:Extract theo lịch trình và so sánh dự án được trích xuất với kho lưu trữ. Sử dụng SqlPackage /Action:DeployReport để xem trước mọi kế hoạch CREATE, ALTERvà DROP trước khi áp dụng các thay đổi. Mục tiêu không phải là ngăn chặn hoàn toàn sự trôi dạt, mà là phát hiện sớm và giải quyết nó trước khi triển khai tiếp theo của bạn biến hotfix thành khôi phục. Tiếp theo, bạn xây dựng các quy trình CI/CD tự động hóa toàn bộ chu trình xây dựng và triển khai.