2010-04-28 76 views
15

Tôi đang cố gắng hiểu rõ hơn tại sao một trong các tập lệnh cập nhật cơ sở dữ liệu của chúng tôi không hoạt động đúng tại một trang web khách hàng cụ thể và thu hẹp nó (tôi nghĩ) về quyền sở hữu và vai trò của cơ sở dữ liệu.Sự khác biệt giữa "db_owner" và "người dùng sở hữu cơ sở dữ liệu" trong SQL Server 2000 là gì?

Disclaimer: Tôi thực sự chờ đợi để nghe lại từ DBA của khách hàng để họ có thể cho chúng tôi biết nếu họ nâng cấp cơ sở dữ liệu SQL của họ thời gian gần đây và vì vậy chúng tôi có thể nhìn vào cơ sở dữ liệu của họ. Tôi đang nghĩ rằng việc chuyển đổi SQL 2000 sang SQL 2005 có thể đã đặt kịch bản lệnh của chúng tôi nếu đăng nhập cơ sở dữ liệu của ứng dụng của chúng tôi được chuyển thành lược đồ, vì chúng tôi đã tham chiếu dbo ở một vài nơi trong tập lệnh cập nhật.

Dù sao, tôi đã cố gắng tìm giải thích tốt hơn về quyền sở hữu và vai trò cơ sở dữ liệu và cách tác động của chủ sở hữu đối tượng cơ sở dữ liệu thực sự được chỉ định khi bạn không chỉ định rõ chủ sở hữu trong câu lệnh T-SQL . Ví dụ, tập lệnh cập nhật của chúng tôi thường chỉ làm CREATE TABLE foo thay vì CREATE TABLE dbo.foo hoặc thứ gì khác, nhưng tôi đã tìm thấy một số được sử dụng rõ ràng dbo và đó là những lỗi gây ra sự cố tại thời điểm này (chỉ dành cho khách hàng này).

Tôi tìm thấy this article (cụ thể cho SQL Server 2000), nhưng bảng trên trang đó khó hiểu. Nó đề cập đến db_owner và "sở hữu cơ sở dữ liệu" là hai khả năng khác biệt cho vai trò người dùng có thể có.

Ví dụ: bảng tuyên bố rằng nếu người dùng sam, là người trong vai trò db_owner, hãy chạy truy vấn CREATE TABLE [test3](abc int), nó sẽ được sở hữu bởi sam.

Sau đó nó đề cập rằng nếu một người dùng khác sue, người "sở hữu cơ sở dữ liệu" (sic), chạy cùng một truy vấn, nó sẽ được sở hữu bởi dbo.

Sẽ không db_owner và "sở hữu cơ sở dữ liệu" là điều tương tự? Bảng này ngụ ý rằng có sự khác biệt giữa "đang ở trong vai trò db_owner" và thực sự "là chủ sở hữu của cơ sở dữ liệu". Nhưng, nếu đó là sự thật, "sở hữu cơ sở dữ liệu" có ý nghĩa gì nếu nó là một thứ khác ngoài vai trò thành viên của vai trò db_owner?

Trả lời

26

Không, db_owner và chủ sở hữu cơ sở dữ liệu không giống nhau. dbo là người dùng và db_owner là vai trò cơ sở dữ liệu. Cơ sở dữ liệu được sở hữu bởi thông tin đăng nhập. Bất cứ thông tin đăng nhập nào sở hữu cơ sở dữ liệu đều được đặt tên là dbo bên trong cơ sở dữ liệu. Bạn có thể thay đổi chủ sở hữu cơ sở dữ liệu bằng cách sử dụng thủ tục được lưu trữ hệ thống sp_changedbowner.

Tất cả các đối tượng trong cơ sở dữ liệu đều do người dùng sở hữu. Người dùng là thành viên của vai trò db_owner, trong số các quyền khác, được phép tạo các đối tượng thuộc sở hữu của dbo. Nếu người dùng không phải là thành viên của db_owner, nhưng có một số quyền tạo (ví dụ: Tạo Bảng), thì bất kỳ đối tượng nào họ tạo sẽ được sở hữu bởi người dùng đã tạo chúng. Bạn có thể thay đổi quyền sở hữu đối tượng bằng cách sử dụng thủ tục được lưu trữ hệ thống sp_changeobjectowner.

+0

Xóa và cho điểm. Câu trả lời tuyệt vời! Đối với bất cứ ai khác đọc này, tôi chỉ muốn thêm một điều nữa tôi tìm thấy thông qua nghiên cứu thêm và một số thử nghiệm. Nếu đăng nhập cơ sở dữ liệu là thành viên của vai trò máy chủ 'sysadmin', các đối tượng cơ sở dữ liệu được tạo bởi đăng nhập đó sẽ được sở hữu bởi' dbo' và (đối với SQL Server 2005), chúng cũng sẽ được thêm vào lược đồ 'dbo' theo mặc định, trừ khi bạn chỉ định một chủ sở hữu/lược đồ khác. –

+1

Ngẫu nhiên, tôi nghĩ rằng tôi biết vấn đề là gì bây giờ. Thông thường, chúng tôi cung cấp cho khách hàng một cơ sở dữ liệu trống mà họ đính kèm vào SQL Server của họ khi họ cài đặt ứng dụng. Tất cả các đối tượng được sở hữu bởi 'dbo'.Chúng tôi cũng có một kịch bản tạo thông tin đăng nhập cơ sở dữ liệu được ứng dụng của chúng tôi sử dụng. Nó chỉ ra kịch bản này đã thêm đăng nhập của ứng dụng vào vai trò máy chủ 'sysadmin' (không có ý tưởng tại sao nó được viết theo cách đó). Tôi đoán là một DBA chăm chỉ thấy điều này và xóa thông tin đăng nhập của chúng tôi khỏi vai trò 'sysadmin', vì họ có nhiều hơn một cơ sở dữ liệu trên máy chủ của họ và ứng dụng của chúng tôi rõ ràng không nên là' sysadmin' –

+1

đăng nhập vào người dùng cơ sở dữ liệu. Các ứng dụng hoạt động tốt mặc dù điều này kể từ khi đăng nhập được tạo ra như là một 'sysadmin'. Tuy nhiên, nếu một DBA đã xóa thông tin đăng nhập khỏi vai trò 'sysadmin', họ sẽ phải ánh xạ thông tin đăng nhập vào một người dùng cơ sở dữ liệu cụ thể trong cơ sở dữ liệu của chúng tôi để ứng dụng của chúng tôi có thể kết nối. Khi họ làm điều này, họ đặt lược đồ mặc định của người dùng giống với tên người dùng. Kịch bản cập nhật của chúng tôi đã giảm và tái tạo một số khung nhìn cơ sở dữ liệu, nhưng chúng tôi không đặt tiền tố cho các tên khung nhìn với một chủ sở hữu/lược đồ, do đó chúng được thêm vào lược đồ của người dùng cơ sở dữ liệu thay vì lược đồ 'dbo'. –

Các vấn đề liên quan