5

Vấn đề tôi muốn giải quyết là xây dựng các tập lệnh khác nhau tùy thuộc vào cấu hình xây dựng.Dự án Cơ sở dữ liệu SQL: xây dựng các kịch bản khác nhau tùy thuộc vào cấu hình xây dựng

Giả sử chúng ta có hai trường hợp của SQL Server: Phiên bản

  • Enterprise với các máy chủ Liên Kết nối
  • LocalDb phiên bản dành cho ẩn xây dựng và đơn vị kiểm tra

phiên bản Enterprise có quan điểm cho các máy chủ liên kết khi LocalDB thay thế các khung nhìn đó bằng các bảng cục bộ.

Các chế độ xem Máy chủ được liên kết này và các bảng cục bộ có cùng tên và tập hợp các trường. Vì vậy, chúng không được bao gồm trong xây dựng theo mặc định (Build Action = None). Thay vào đó chúng được bao gồm trong xây dựng trong BeforeBuild Target của tệp dự án.

<Target Name="BeforeBuild"> 

    <ItemGroup Condition=" '$(Configuration)' == 'LocalDb'"> 
     <Build Include="Local_Tables\*.sql" /> 
    </ItemGroup> 

    <ItemGroup Condition=" '$(Configuration)' != 'LocalDb' "> 
     <Build Include="Linked_Server_Views\*.sql" /> 
    </ItemGroup> 

</Target> 

Nhưng vấn đề là Visual Studio lưu trữ Model DB và nếu chúng ta đầu tiên xây dựng dự án cho LocalDb và sau đó cố gắng xây dựng dự án cho cấu hình Enterprise - Visual đầu ra Studio lỗi:

Lỗi: SQL71508: Các mô hình đã có một phần tử có cùng tên

Nếu để đóng và mở giải pháp hoặc dỡ dự án và tải lại dự án, Visual Studio tạo lại các tệp dbmdl và cấu hình doanh nghiệp đang được xây dựng không có lỗi.

Giả sử của tôi là nếu tôi làm mới bộ nhớ cache dbmdl, tôi sẽ nhận được bản dựng trơn tru không có lỗi.


Khi bạn mở hoặc tải lại dự án cơ sở dữ liệu SQL Server trong Visual Studio 2012, nó tạo ra một tập tin với phần mở rộng dbmdl, mà là một mô hình db deserialized và cache như mô tả here.

Trong khoảnh khắc của tập tin dbmdl giải trí Visual Studio kết quả đầu ra như sau:

Deserializing the project state for project 'MyProject.sqlproj'... 
Detecting file changes for project 'MyProject.sqlproj'... 
Deserialization has been completed for project 'MyProject.sqlproj'. 

Làm thế nào để buộc Visual Studio để làm mới bộ nhớ cache dbmdl mà không cần tải lại dự án và không thay đổi của tập tin xml dự án?

Có cách nào để làm mới bộ nhớ cache dbmdl đặt lệnh vào mục BeforeBuild hoặc AfterBuild của tệp xml dự án không?

Hoặc toàn bộ cách tiếp cận vấn đề là sai và có một cách khác để xây dựng các tập lệnh khác nhau tùy thuộc vào cấu hình xây dựng?

Trả lời

4

Bạn có thể có tùy chọn có thể khác trong việc sử dụng dự án tổng hợp. Jamie Thompson đã viết blog về chúng tại đây: http://sqlblog.com/blogs/jamie_thomson/archive/2013/03/10/deployment-of-client-specific-database-code-using-ssdt.aspx

Điều này sẽ cho phép bạn xây dựng một dự án chính và kết hợp với các dự án bổ sung với mã dành riêng cho môi trường. Bạn có thể triển khai một trong những thích hợp bằng cách làm một số kiểm tra trong các kịch bản phát hành.

1

Tôi đã suy nghĩ về điều này và cách tốt nhất để xử lý nó bằng SSDT. Tôi có lẽ không có một cách "tốt nhất", nhưng nếu bạn có thể xác định đúng phiên bản trước khi xuất bản thay đổi của bạn, tôi muốn xem xét việc này:

  1. Tạo công khai hồ sơ cho mỗi edition - với và mà không có máy chủ được liên kết.
  2. Tạo biến để giữ tên máy chủ được liên kết của bạn, có thể bao gồm cơ sở dữ liệu cũng như vậy, chẳng hạn như "[Server].[Cơ sở dữ liệu]. "
  3. Tạo tập lệnh hậu triển khai cho chế độ xem máy chủ được liên kết của bạn. Các quyền này phải bao gồm quyền, các biến cho tên máy chủ được liên kết, v.v.
  4. Trong tập lệnh Post-Deploy, truy vấn" Nếu nó sẽ sử dụng các máy chủ được liên kết, hãy thả/tạo lại các khung nhìn máy chủ không được liên kết gốc trong dự án để sử dụng các máy chủ đó trên các máy chủ được liên kết./DB cho máy chủ được liên kết và bạn có thể chỉ cần sử dụng một bộ mã.

Điều này có bất lợi khi không thể kiểm tra mã của bạn, nhưng sẽ cung cấp cho bạn một nơi để lưu trữ các chế độ xem máy chủ được liên kết đó và một cái e từ đó để triển khai chúng. Bạn sẽ cần phải phát hành với Drop/Create thay vì để SSDT xử lý các thay đổi có nghĩa là chúng sẽ được tạo lại trên mỗi hành động Xuất bản. Tôi nghĩ rằng nó có thể cung cấp cho bạn các giải pháp mà bạn đang tìm kiếm, mặc dù.

+0

Peter cảm ơn bạn đã trả lời. Tôi vẫn không có giải pháp cho câu hỏi của tôi. Tôi sẽ cố gắng tư vấn cho dự án tiếp theo. Nhưng tôi đoán là việc di chuyển việc tạo bảng/lượt xem sang kịch bản Post-Deploy sẽ cho chúng ta lỗi trong khi xây dựng, bởi vì các đối tượng khác tham khảo các bảng/khung nhìn đó. –

+1

Vâng, về mặt kỹ thuật, bạn có thể rời khỏi chế độ xem "cục bộ" cho dự án của mình để mọi thứ sẽ được xây dựng, sau đó thêm phần sau triển khai để điều chỉnh tất cả để chạy với máy chủ được liên kết chỉ khi bạn sử dụng chúng. Tôi đồng ý nó không phải là cách tốt nhất để xử lý nó, nhưng nó sẽ làm việc nếu bạn làm theo cách đó. –

+1

Bạn có thể có một tùy chọn có thể khác trong việc sử dụng các dự án tổng hợp. Jamie Thompson viết blog về chúng ở đây: http://sqlblog.com/blogs/jamie_thomson/archive/2013/03/10/deployment-of-client-specific-database-code-using-ssdt.aspx –