Tôi tin rằng tôi đã tìm thấy câu trả lời có thẩm quyền, được trợ giúp rất nhiều bởi bảng được cung cấp trong bài viết này: http://msdn.microsoft.com/en-us/l Library / ms178569.aspx . Dường như CREATE DATABASE thực sự là sự cho phép tuân thủ SQL của ANSI, trong khi CREATE ANY DATABASE là quyền của máy chủ độc quyền MSSQL. Tuy nhiên, hai người không giống nhau. Trong thực tế, có một sự khác biệt khá quan trọng giữa hai người, và tôi đã tìm ra điều này bằng cách thử nó.
Cả hai đều là quyền, nhưng CREATE DATABASE chỉ xem xét bối cảnh bảo mật của cơ sở dữ liệu hiện đang được sử dụng, trong khi CREATE ANY DATABASE có thể tra cứu danh sách đăng nhập trên Máy chủ SQL. Điều này dường như được triển khai vì kỳ vọng chung cho máy chủ SQL ANSI là các quyền được trao trong một số cơ sở dữ liệu hệ thống chính, với người dùng trong cơ sở dữ liệu đó được cấp quyền. Sau đó, hành vi mặc định của cơ sở dữ liệu mới là tham khảo ý kiến tổng thể để xem nó nên thừa kế những quyền nào. (SQL 101, tôi biết, nhưng nó thực sự được minh họa ở đây.)
Vì vậy, khi bạn cấp CREATE DATABASE, bạn thực sự phải có một người dùng chính để cấp quyền này. Nếu bạn thử cách này, nó hoạt động (tạo người dùng chính, cấp cho nó tạo cơ sở dữ liệu, sau đó bạn có thể tạo cơ sở dữ liệu). Tuy nhiên, bằng cách cấp tạo bất kỳ cơ sở dữ liệu nào (hoặc cấp dbcreator vai trò), bạn không cần phải là người dùng chính thức.
Để minh họa thêm cho sự khác biệt giữa hai quyền, hãy quan sát các thông báo khác nhau được trả về bằng cách cấp cho người dùng CREATE DATABASE trên master so với cơ sở dữ liệu khác, sau đó rửa sạch và lặp lại cho quyền TẠO BẤT CỨ dữ liệu nào.
use master; GRANT CREATE DATABASE to TestUser
Msg 15151, Cấp 16, Trạng thái 1, Dòng 1 Không thể tìm thấy người dùng 'Người dùng thử', vì nó không tồn tại hoặc bạn không có quyền.
Lỗi này xảy ra do người dùng TestUser chưa có trong cơ sở dữ liệu chủ. Đây là một quyền cấp cơ sở dữ liệu - nó không có ngữ cảnh để đi ra ngoài cơ sở dữ liệu đã chọn và tìm kiếm thông tin đăng nhập hoặc người dùng. Lưu ý rằng nếu bạn tạo người dùng chính trước, lệnh này thành công và bạn có thể tạo cơ sở dữ liệu giống như khi TẠO BẤT CỨ dữ liệu nào được cấp cho bạn.
use master; GRANT CREATE ANY DATABASE to TestUser
Lệnh đã hoàn thành thành công.
Điều này thành công bởi vì, với tư cách là quyền của Microsoft SQL Server độc quyền, CREATE ANY DATABASE có thể tham khảo danh sách đăng nhập cho phiên bản SQL, không chỉ người dùng trong cơ sở dữ liệu hiện đang sử dụng.
use test; GRANT CREATE DATABASE to TestUser
Msg 15151, Cấp 16, Trạng thái 1, Dòng 1 Không thể tìm thấy người dùng 'Người dùng thử', vì nó không tồn tại hoặc bạn không có quyền.
Điều này chứng tỏ tính nhất quán của lời giải thích của tôi cho ví dụ đầu tiên. Lưu ý các truy vấn dưới đây và thông báo lỗi kết quả của nó. Bạn sẽ không nhận được thông báo lỗi này nếu lần đầu tiên bạn tạo người dùng trong cơ sở dữ liệu này (xem truy vấn cuối cùng).
use test; GRANT CREATE ANY DATABASE to TestUser
Msg 4621, Cấp 16, Trạng thái 10, Dòng 1 Quyền ở phạm vi máy chủ chỉ có thể được cấp khi cơ sở dữ liệu hiện tại là chính
Như được hiển thị trong truy vấn thứ hai, TẠO BẤT K DAT BẤT K DAT ĐẠI DIỆN nào liệt kê danh sách các thông tin đăng nhập, nơi tôi đã tạo tên đăng nhập này. Vì vậy, trong khi SQL Server thừa nhận sự tồn tại của người dùng, nó vẫn bị lỗi do tôi đang cố cấp quyền cấp máy chủ ở một nơi khác ngoài chủ, không được phép trong MSSQL.
use test; create user TestUser; grant create database to TestUser
TẠO quyền cho phép chỉ có thể được cấp trong cơ sở dữ liệu chủ. Msg 0, Level 11, State 0, Line 0 Đã xảy ra lỗi nghiêm trọng trên lệnh hiện tại. Các kết quả, nếu có, cần được loại bỏ.
Bây giờ có một người dùng để TẠO RA BẢNG áp dụng, tôi nhận được thông báo lỗi chung rằng bạn không thể cấp quyền cấp máy chủ ở bất cứ đâu ngoài chủ, vì đó là nơi SQL Server lưu trữ các quyền này.
Vâng, điều này thật thú vị.