จะอนุญาตให้ใช้งานโพรซีเดอร์ที่เก็บไว้ แต่ไม่ได้เขียนได้อย่างไร


11

ฉันต้องการตั้งค่าผู้ใช้ "อ่าน" บนอินสแตนซ์ SQL Server 2012 ของฉัน ฉันต้องการอนุญาตให้เขามีสิทธิ์ดำเนินการกระบวนงานที่เก็บไว้หรือฟังก์ชันหรือคำสั่ง SQL โดยตรงซึ่งดึงข้อมูลจากตารางและมุมมองทั้งหมด แต่ไม่อัปเดตหรือแทรก (เช่นอ่านอะไรและเขียนอะไร)

ฉันสามารถตั้งค่านี้ได้โดยไม่ให้สิทธิ์เฉพาะกับแต่ละฟังก์ชั่นหรือขั้นตอนการจัดเก็บตามชื่อ แต่ให้สิทธิ์การดำเนินการที่ถูกต้องกับฟังก์ชั่นใด ๆ หรือขั้นตอนการจัดเก็บ

จะมีอะไรเปลี่ยนแปลงไหมถ้าฉันใช้ SQL Server 2008 แทน

ชี้แจงและเพิ่มเติม:

  1. หากขั้นตอนการจัดเก็บเปลี่ยนแปลงข้อมูลผู้ใช้ควรได้รับข้อความแสดงข้อผิดพลาด (ปฏิเสธการแก้ไขหรือปฏิเสธการเข้าถึงขั้นตอนการจัดเก็บทั้งหมด)
  2. หากวิธีแก้ไขที่เป็นไปได้เกี่ยวข้องกับการปฏิเสธสิทธิ์ฉันจะไม่ให้สิทธิ์บางอย่างแทนการปฏิเสธได้หรือไม่
  3. สามารถใช้การปฏิเสธกับตารางทั้งหมดมุมมอง ฯลฯ (มีอยู่ทั้งในปัจจุบันและในอนาคต) ในฐานข้อมูลในคำสั่งเดียวได้หรือไม่

ฉันใหม่ที่นี่โปรดตั้งค่าแท็กตามความเหมาะสมและเพื่อแก้ไขคำถาม
gt6989b

1
@KrisGruttemeyer นั่นเป็นความคิด - เขาสามารถดำเนินการได้ แต่มันจะส่งผลให้เกิดข้อผิดพลาดบางอย่าง; อีกทางเลือกหนึ่งฉันก็โอเคกับเขาที่ไม่ได้รับอนุญาตให้ดำเนินการตราบใดที่ฉันไม่ต้องระบุรายการของ sp เขามีสิทธิ์ใช้งาน
gt6989b

1
ในกรณีนี้คุณต้องอ่านเกี่ยวกับการอนุญาต SQL Server มี 3 สายพันธุ์ที่ได้รับอนุญาตเป็น - GRANTจะให้สิทธิ์DENYที่จะปฏิเสธการอนุญาตและ REVOKEการลบหรือGRANT DENYหากไม่มีผู้ใช้GRANTหรือDENYผู้ใช้สามารถสืบทอดสิทธิ์ให้พูดจากการเข้าถึงขั้นตอนที่เก็บไว้
JNK

1
@ gt6989b หากคุณDENY DELETE, INSERT, UPDATEอยู่ในฐานข้อมูลหรือสคีมาฉันเชื่อว่าจะมีผลกับตารางและมุมมองเท่านั้น
JNK

1
@ gt6989b - เพียงสังเกตว่าคำตอบที่แนะนำในความคิดเห็นเหล่านี้กลายเป็นไม่ถูกต้อง ดูคำตอบของ Paul White
RLF

คำตอบ:


15

สิ่งนี้ไม่ง่ายอย่างที่คุณคิด วิธีหนึ่งคือการสร้างบทบาทฐานข้อมูลที่ผู้ใช้กำหนดใหม่ให้สิทธิ์ทั้งหมดที่จำเป็นสำหรับบทบาทนั้นจากนั้นเพิ่มผู้ใช้ในบทบาทใหม่ อย่างน้อยก็ช่วยให้ผู้ใช้ (หรือบทบาทอื่น ๆ ที่ผู้ใช้กำหนดเอง) ได้รับอนุญาตชุดนี้ในอนาคต ขั้นตอนต่อไปนี้เป็นการเริ่มต้นที่ดี:

-- The user-defined role containing all required permissions
CREATE ROLE Readers AUTHORIZATION dbo;

-- Give read-only access to all tables,
-- views on those tables, and in-line
-- functions
ALTER ROLE db_datareader ADD MEMBER Readers;

-- Example: add a user (Bob) to the role
ALTER ROLE Readers ADD MEMBER Bob;

หลังจากนี้ Bob จะมีสิทธิ์อ่านอย่างเดียวในฐานข้อมูล เขาจะสามารถอ่านจากตารางทั้งหมดมุมมองบนตารางเหล่านั้นและฟังก์ชันในบรรทัด เขาจะไม่สามารถดำเนินการขั้นตอนใด ๆ หรือใช้ฟังก์ชั่นที่ไม่ใช่แบบอินไลน์

คุณจะต้องให้สิทธิ์เฉพาะกับบทบาทผู้อ่านสำหรับฟังก์ชั่นและขั้นตอนที่ปลอดภัยที่คุณต้องการให้ผู้อ่านเข้าถึงได้ อาจมีขั้นตอนที่คุณสามารถดำเนินการเพื่อให้กระบวนการนี้ง่ายขึ้น (เช่นการจัดกลุ่มวัตถุลงในสคีมาและให้สิทธิ์ดำเนินการบนสคีมาแทนวัตถุแต่ละชิ้น) แต่มีรายละเอียดมากมายเกินกว่าที่จะครอบคลุมที่นี่

สิ่งหนึ่งที่ต้องระวังคือการไม่มีสิทธิ์ในการปรับเปลี่ยนข้อมูลจะไม่ป้องกันผู้อ่านจากการเปลี่ยนข้อมูลผ่านขั้นตอนการจัดเก็บที่เธอได้รับอนุญาตให้ดำเนินการในกรณีที่ขั้นตอนและวัตถุที่มีการแก้ไขร่วมกันเป็นเจ้าของร่วม ในกรณีนี้จะไม่ยอมรับการปฏิเสธอย่างชัดเจนหรือ คุณลักษณะนี้เป็นที่รู้จักกันเป็นเจ้าของ Chaining

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