ฉันเชื่อว่าฉันได้พบคำตอบที่มีอำนาจช่วยอย่างมากโดยตารางที่ให้ไว้ในบทความนี้: http://msdn.microsoft.com/en-us/library/ms178569.aspx ดูเหมือนว่า CREATE DATABASE นั้นได้รับอนุญาตตามมาตรฐาน ANSI SQL ในขณะที่ CREATE DATABASE นั้นเป็นฐานข้อมูล MSSQL ที่ได้รับอนุญาตจากเซิร์ฟเวอร์ อย่างไรก็ตามทั้งสองไม่เหมือนกัน ในความเป็นจริงมีความแตกต่างที่สำคัญระหว่างสองสิ่งนี้และฉันพบสิ่งนี้โดยลองใช้
ทั้งสองสิทธิ์ แต่ CREATE DATABASE ให้คำปรึกษาเฉพาะบริบทความปลอดภัยของฐานข้อมูลที่ใช้ในปัจจุบันในขณะที่สร้างฐานข้อมูลใด ๆ สามารถค้นหารายการการเข้าสู่ระบบบน SQL Server สิ่งนี้ดูเหมือนว่าจะนำมาใช้เพราะความคาดหวังทั่วไปสำหรับเซิร์ฟเวอร์ ANSI SQL คือการอนุญาตให้ใช้สิทธิ์ในฐานข้อมูลระบบหลักบางส่วนโดยผู้ใช้ในฐานข้อมูลนั้นจะได้รับสิทธิ์ จากนั้นพฤติกรรมเริ่มต้นของฐานข้อมูลใหม่คือการปรึกษาต้นแบบเพื่อดูว่าสิทธิ์ใดที่ควรสืบทอด (SQL 101 ฉันรู้ แต่มันสุดขั้วจริงๆที่นี่)
ดังนั้นเมื่อคุณให้ CREAT DATABASE คุณต้องมีผู้ใช้หลักในการให้สิทธิ์นี้ หากคุณลองทำสิ่งนี้มันใช้งานได้ (สร้างผู้ใช้เป็นหลักให้สิทธิ์สร้างฐานข้อมูลจากนั้นคุณสามารถสร้างฐานข้อมูลได้) อย่างไรก็ตามโดยการอนุญาตให้สร้างฐานข้อมูลใด ๆ (หรือการอนุญาตบทบาท dbcreator) คุณไม่จำเป็นต้องเป็นผู้ใช้ที่แท้จริงในต้นแบบ
เมื่อต้องการแสดงให้เห็นถึงความแตกต่างระหว่างสิทธิ์สองอย่างเพิ่มเติมให้สังเกตข้อความที่แตกต่างกันที่ส่งคืนโดยให้ผู้ใช้สร้างฐานข้อมูลบนต้นแบบเทียบกับฐานข้อมูลอื่นจากนั้นล้างและทำซ้ำเพื่อขอสิทธิ์สร้างฐานข้อมูลใด ๆ
use master; GRANT CREATE DATABASE to TestUser
ข่าวสารเกี่ยวกับ 15151, ระดับ 16, สถานะ 1, บรรทัด 1 ไม่พบผู้ใช้ 'TestUser' เนื่องจากไม่มีอยู่หรือคุณไม่มีสิทธิ์ใช้งาน
ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากผู้ใช้ TestUser ยังไม่ได้อยู่ในฐานข้อมูลหลัก นี่เป็นสิทธิ์ระดับฐานข้อมูล - ไม่มีบริบทที่จะออกไปนอกฐานข้อมูลที่เลือกและค้นหาการเข้าสู่ระบบหรือผู้ใช้ โปรดทราบว่าถ้าคุณสร้างผู้ใช้ในระดับปริญญาโทก่อนคำสั่งนี้จะสำเร็จและคุณสามารถสร้างฐานข้อมูลได้เหมือนกับว่าสร้างฐานข้อมูลใด ๆ ให้กับคุณ
use master; GRANT CREATE ANY DATABASE to TestUser
คำสั่งเสร็จสมบูรณ์แล้ว
สิ่งนี้ประสบความสำเร็จเพราะในฐานะสิทธิ์ Microsoft SQL Server กรรมสิทธิ์สร้างฐานข้อมูลใด ๆ สามารถดูรายการการเข้าสู่ระบบสำหรับอินสแตนซ์ SQL ไม่ใช่เฉพาะผู้ใช้ในฐานข้อมูลที่ใช้ในปัจจุบัน
use test; GRANT CREATE DATABASE to TestUser
ข่าวสารเกี่ยวกับ 15151, ระดับ 16, สถานะ 1, บรรทัด 1 ไม่พบผู้ใช้ 'TestUser' เนื่องจากไม่มีอยู่หรือคุณไม่มีสิทธิ์ใช้งาน
นี่แสดงให้เห็นถึงความสอดคล้องของคำอธิบายของฉันสำหรับตัวอย่างแรก หมายเหตุแบบสอบถามด้านล่างและข้อความแสดงข้อผิดพลาดผลลัพธ์ คุณจะไม่ได้รับข้อความแสดงข้อผิดพลาดนี้หากคุณสร้างผู้ใช้ในฐานข้อมูลนี้เป็นครั้งแรก (ดูแบบสอบถามล่าสุด)
use test; GRANT CREATE ANY DATABASE to TestUser
ข่าวสารเกี่ยวกับ 4621, ระดับ 16, สถานะ 10, การอนุญาต 1 บรรทัดที่ขอบเขตเซิร์ฟเวอร์จะได้รับเฉพาะเมื่อฐานข้อมูลปัจจุบันเป็นหลัก
ดังที่แสดงในเคียวรีที่สองสร้างฐานข้อมูลใด ๆ ให้คำปรึกษารายการการเข้าสู่ระบบที่ฉันได้สร้างชื่อเข้าสู่ระบบนี้แล้ว ดังนั้นในขณะที่ SQL Server ยอมรับการมีอยู่ของผู้ใช้มันยังคงมีข้อผิดพลาดเนื่องจากฉันกำลังพยายามให้สิทธิ์ระดับเซิร์ฟเวอร์ที่อื่นนอกเหนือจากหลักซึ่งไม่ได้รับอนุญาตใน MSSQL
use test; create user TestUser; grant create database to TestUser
สร้างการอนุญาตฐานข้อมูลสามารถใช้ได้ในฐานข้อมูลหลักเท่านั้น ข่าวสารเกี่ยวกับ 0, ระดับ 11, สถานะ 0, บรรทัด 0 มีข้อผิดพลาดร้ายแรงเกิดขึ้นกับคำสั่งปัจจุบัน ควรยกเลิกผลลัพธ์หากมี
ตอนนี้มีผู้ใช้สำหรับสร้างฐานข้อมูลที่จะนำไปใช้ฉันได้รับข้อความแสดงข้อผิดพลาดทั่วไปที่คุณไม่สามารถให้สิทธิ์ระดับเซิร์ฟเวอร์ที่ใดก็ได้ยกเว้นต้นแบบเนื่องจากที่ SQL Server เก็บสิทธิ์เหล่านี้
นี่มันสนุกดี