Mục đích chính của cơ sở dữ liệu chứa là giúp việc chuyển cơ sở dữ liệu của bạn sang một máy chủ mới dễ dàng hơn mà không cần nhiều giàn giáo xung quanh nó. Với ý nghĩ đó, tôi sẽ xử lý một số vấn đề tiềm ẩn sẽ khiến việc di chuyển này trở nên khó khăn hơn - và hầu hết xoay quanh thực tế là các cơ sở dữ liệu chứa chỉ được chứa một phần trong SQL Server 2012 (ngăn chặn không thực sự được thi hành).
Chuỗi kết nối
Chuỗi kết nối đến cơ sở dữ liệu chứa phải chỉ định rõ ràng cơ sở dữ liệu trong chuỗi kết nối. Bạn không còn có thể dựa vào cơ sở dữ liệu mặc định của thông tin đăng nhập để thiết lập kết nối; nếu bạn không chỉ định cơ sở dữ liệu, SQL Server sẽ không chuyển qua tất cả các cơ sở dữ liệu được chứa và cố gắng tìm bất kỳ cơ sở dữ liệu nào mà thông tin đăng nhập của bạn có thể khớp.
Truy vấn chéo db
Ngay cả khi bạn tạo cùng một người dùng có cùng mật khẩu trong hai cơ sở dữ liệu chứa khác nhau trên cùng một máy chủ, ứng dụng của bạn sẽ không thể thực hiện các truy vấn cơ sở dữ liệu chéo. Tên người dùng và mật khẩu có thể giống nhau, nhưng họ không phải là cùng một người dùng. Lý do cho điều này? Nếu bạn đã chứa cơ sở dữ liệu trên một máy chủ được lưu trữ, bạn không nên bị ngăn chặn có cùng một người dùng được chứa như một người khác đang sử dụng cùng một máy chủ được lưu trữ. Khi ngăn chặn đầy đủ đến (có thể trong phiên bản sau SQL Server 2012 không bao giờ), truy vấn cơ sở dữ liệu chéo sẽ hoàn toàn bị cấm. Tôi rất, rất, rất khuyến khích bạn không nên tạo thông tin đăng nhập cấp máy chủ có cùng tên với người dùng cơ sở dữ liệu có chứa và cố gắng tránh tạo cùng tên người dùng trong các cơ sở dữ liệu có chứa. Nếu bạn cần chạy các truy vấn đánh vào nhiều cơ sở dữ liệu chứa, hãy sử dụng thông tin đăng nhập cấp máy chủ có các đặc quyền phù hợp (bạn có thể nghĩ rằng đây là sysadmin
, nhưng đối với các truy vấn chỉ đọc, đây là CONNECT ANY DATABASE
và SELECT ALL USER SECURABLES
).
Từ đồng nghĩa
Hầu hết các tên 3 và 4 phần đều dễ xác định và xuất hiện trong DMV. Tuy nhiên, nếu bạn tạo một từ đồng nghĩa trỏ đến tên 3 hoặc 4 phần, những từ này không hiển thị trong DMV. Vì vậy, nếu bạn sử dụng nhiều từ đồng nghĩa, có thể bạn sẽ bỏ lỡ một số phụ thuộc bên ngoài và điều này có thể gây ra sự cố tại điểm bạn di chuyển cơ sở dữ liệu sang máy chủ khác. Tôi đã phàn nàn về vấn đề này, nhưng nó đã bị đóng là "theo thiết kế" và không tồn tại trong quá trình di chuyển sang hệ thống phản hồi mới . Lưu ý rằng DMV cũng sẽ bỏ lỡ các tên 3 và 4 phần được xây dựng thông qua SQL động.
Chính sách mật khẩu
Nếu bạn đã tạo một người dùng cơ sở dữ liệu chứa trên một hệ thống không có chính sách mật khẩu, bạn có thể khó tạo cùng một người dùng trên một hệ thống khác có chính sách mật khẩu. Điều này là do CREATE USER
cú pháp không hỗ trợ bỏ qua chính sách mật khẩu. Tôi đã báo lỗi về vấn đề này và nó vẫn mở (và nó cũng không tồn tại khi di chuyển khi Connect đã nghỉ hưu). Và có vẻ lạ đối với tôi rằng trên một hệ thống có chính sách mật khẩu, bạn có thể tạo thông tin đăng nhập cấp máy chủ dễ dàng bỏ qua chính sách, nhưng bạn không thể tạo người dùng cơ sở dữ liệu như vậy - mặc dù người dùng này vốn đã ít rủi ro bảo mật.
Đối chiếu
Vì chúng tôi không còn có thể dựa vào đối chiếu tempdb, nên bạn có thể cần thay đổi bất kỳ mã nào hiện đang sử dụng đối chiếu rõ ràng hoặc DATABASE_DEFAULT
sử dụng CATALOG_DEFAULT
thay thế. Xem bài viết BOL này cho một số vấn đề tiềm năng .
IntelliSense
Nếu bạn kết nối với cơ sở dữ liệu chứa dưới dạng người dùng được chứa, SSMS sẽ không hỗ trợ đầy đủ IntelliSense. Bạn sẽ nhận được gạch chân cơ bản cho các lỗi cú pháp, nhưng không có danh sách hoặc chú giải công cụ tự động hoàn thành và tất cả nội dung thú vị. Tôi đã gửi một lỗi về vấn đề này, và nó vẫn mở - và một lỗi nữa không tồn tại được.
Công cụ dữ liệu SQL Server
Nếu bạn dự định sử dụng SSDT để phát triển cơ sở dữ liệu, hiện tại không có hỗ trợ đầy đủ cho cơ sở dữ liệu chứa. Điều đó thực sự có nghĩa là việc xây dựng dự án sẽ không thành công nếu bạn sử dụng một số tính năng hoặc cú pháp phá vỡ sự ngăn chặn, vì SSDT hiện không biết ngăn chặn là gì và điều gì có thể phá vỡ nó.
THAY ĐỔI
Khi chạy một ALTER DATABASE
lệnh từ trong ngữ cảnh của cơ sở dữ liệu chứa, rRather hơn ALTER DATABASE foo
bạn sẽ cần sử dụng ALTER DATABASE CURRENT
- điều này là để nếu cơ sở dữ liệu được di chuyển, đổi tên, v.v. các lệnh này không cần biết gì về bối cảnh bên ngoài hoặc tham chiếu của chúng .
Một vài người khác
Một số thứ bạn có thể không nên sử dụng nhưng dù sao cũng nên được đề cập trong danh sách những thứ không được hỗ trợ hoặc không được dùng nữa và không nên được sử dụng trong cơ sở dữ liệu chứa:
- thủ tục đánh số
- thủ tục tạm thời
- thay đổi đối chiếu trong các đối tượng ràng buộc
- thay đổi dữ liệu
- theo dõi thay đổi
- nhân rộng
Như đã nói, những điều này không nhất thiết là những bất lợi khi sử dụng cơ sở dữ liệu có chứa, chúng chỉ là những vấn đề bạn cần lưu ý và không được tiết lộ rõ ràng trong tài liệu chính thức.
Bạn cũng cần chắc chắn rằng nếu một cơ sở dữ liệu chứa sẽ được di chuyển, hoặc là một phần của nhóm khả dụng hoặc đang được nhân đôi, thì tất cả các máy chủ đích tiềm năng đều có sp_configure
tùy chọn contained database authentication
được đặt thành 1.
Bạn có thể thấy bài đăng trên blog này hữu ích, cũng như bài này , mặc dù họ đã đăng ký trước RTM.