ฉันเป็นโปรแกรมเมอร์ไม่ใช่ dba ... ฉันรู้ว่าเพียงพอที่จะเป็นอันตราย
ฉันได้รับมรดกฐานข้อมูลด้วยผู้ใช้ดั้งเดิมที่เป็น db_owner สำหรับฐานข้อมูล เราไม่สามารถปรับการอนุญาตของผู้ใช้นี้สำหรับตาราง schema ที่มีอยู่ ฯลฯ ด้วยเหตุผลทางธุรกิจ แต่มีการสร้างตารางใหม่บางตารางขึ้นและฉันต้องการให้ผู้ใช้นี้มีสิทธิ์เข้าถึง SELECT เหล่านั้นเท่านั้น
มีการตั้งค่าการอนุญาตสำหรับผู้ใช้นี้สำหรับตารางเหล่านี้เพื่อให้ทุกอย่างถูกปฏิเสธยกเว้น SELECT ซึ่งตั้งค่าเป็น GRANT
แต่เมื่อผู้ใช้นี้ (dbadmin) พยายามทำการเลือกบนหนึ่งในตารางเหล่านี้ (AccountingAudit) ข้อผิดพลาดนี้เกิดขึ้น:
The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'.
ฉันใช้ SQL นี้เพื่อลองดูว่ามีการตั้งค่าการอนุญาตสำหรับตาราง / ผู้ใช้นี้:
select object_name(major_id) as object,
user_name(grantee_principal_id) as grantee,
user_name(grantor_principal_id) as grantor,
permission_name,
state_desc
from sys.database_permissions
และนี่คือสิ่งที่ฉันได้รับ:
AccountingAudit dbadmin dbo ALTER DENY
AccountingAudit dbadmin dbo CONTROL DENY
AccountingAudit dbadmin dbo DELETE DENY
AccountingAudit dbadmin dbo INSERT DENY
AccountingAudit dbadmin dbo REFERENCES DENY
AccountingAudit dbadmin dbo SELECT GRANT
AccountingAudit dbadmin dbo TAKE OWNERSHIP DENY
AccountingAudit dbadmin dbo UPDATE DENY
AccountingAudit dbadmin dbo VIEW DEFINITION DENY
AccountingAudit dbadmin dbo VIEW CHANGE TRACKING DENY
ดูเหมือนว่ามันควรจะทำงานใช่มั้ย
การเรียก SELECT ที่ฉันกำลังทำนั้นเป็น SELECT ขั้นพื้นฐานอย่างยิ่งจาก AccountingAudit จากภายใน SSMS ฉันไม่ได้ทำอะไรเป็นพิเศษ sp_executesql หรืออะไรทำนองนั้น
ฉันพยายามให้สิทธิ์อย่างชัดเจน:
GRANT SELECT ON [dbo].AccountingAudit TO dbadmin
สิ่งนี้ไม่มีผลกระทบ (เพราะเหตุใดแบบสอบถามด้านบนจึงแสดงว่าได้รับแล้ว! ;-)
ฉันค้นหาผ่าน stackoverflow.com และที่อื่น ๆ แล้วและไม่พบสิ่งที่ฉันยังไม่ได้ลอง ฉันสงสัยว่ามันมีบางอย่างเกี่ยวกับวิธีการตั้งค่า schema (ณ จุดนี้ฉันรู้เรื่องสคีมาน้อยมาก)
ความคิดใด ๆ ขอบคุณ!