สร้างฐานข้อมูลกับสร้างสิทธิ์ฐานข้อมูลใด ๆ


21

ใน Microsoft SQL Server ความแตกต่างระหว่างCREATE DATABASEและCREATE ANY DATABASEสิทธิ์คืออะไร

ฉันไม่สามารถหาคำตอบที่เชื่อถือได้ ที่ดีที่สุดที่ฉันสามารถอนุมานได้ก็คือ (a) CREATE ANYหมายถึงฉันสามารถสร้างฐานข้อมูลที่จะเป็นเจ้าของโดยผู้ใช้รายอื่นในขณะที่CREATEฉันไม่สามารถหรือ (b) ได้รับอนุญาตเดิมใน Sybase / วันแรกของ SQL Server CREATE ANYและCREATEเป็นนามแฝง สอดคล้องกับ ANSI


สะท้อนสิ่งที่แอรอนพูด +1 แต่คุณควรตัดการแก้ไขวางเป็นคำตอบแล้วยอมรับ เหตุผลสองข้อ: อธิบายให้ชัดเจนว่าคำตอบคืออะไร (และการแก้ไขของคุณเป็นคำตอบที่ยอดเยี่ยม) และยังเป็นเรื่องย่อ
Simon Righarts

1
เสร็จสิ้น แต่ฉันไม่สามารถยอมรับได้จนถึงวันพรุ่งนี้และฉันไม่สามารถโพสต์คำตอบใด ๆ เมื่อวานนี้ (จำกัด 5 ชั่วโมงในการตอบด้วยตนเองสำหรับ <100 ตัวแทน)
Tohuw

คำตอบ:


21

ฉันเชื่อว่าฉันได้พบคำตอบที่มีอำนาจช่วยอย่างมากโดยตารางที่ให้ไว้ในบทความนี้: 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 เก็บสิทธิ์เหล่านี้

นี่มันสนุกดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.