SQL Server: ให้สิทธิ์การเข้าถึงแก่ผู้ใช้ในมุมมองและไม่ได้อยู่ในตาราง


11

ฉันมีอินสแตนซ์ SQL Server 2012 ที่มีฐานข้อมูลน้อย ในหนึ่งในนั้นฉันสร้างมุมมองที่เลือกตารางมากกว่าฐานข้อมูล

ฉันต้องการให้ผู้ใช้สามารถเลือกมุมมองนั้น แต่ต้องไม่เลือกตาราง มุมมองถูกสร้างขึ้นอย่างแน่นอนเนื่องจากผู้ใช้ไม่สามารถเลือกตาราง

ฉันอ่าน/programming/368414/grant-select-on-a-view-not-base-tableและhttp://msdn.microsoft.com/en-us/library/ms188676 aspxและยังคงไม่ทำงาน

หากฉันทำGRANT SELECT TABLE TO USERตารางทั้งหมดผู้ใช้สามารถเลือกมุมมองได้ แต่ถ้าฉันเพิกถอนตารางใด ๆ ก็ล้มเหลว

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

ใครช่วยสอนให้ฉันเกี่ยวกับวิธีการทำมันหรือตัวอย่างรหัส?


เมื่อผู้ใช้SELECTsมุมมองที่ฉันได้รับข้อความ:

ได้รับอนุญาต SELECT ถูกปฏิเสธบนวัตถุ<TABLE>ฐานข้อมูลคี<DB>dbo

ถ้าฉันให้สิทธิ์เลือกในตารางนั้นข้อความแสดงข้อผิดพลาดจะเปลี่ยนชื่อตารางเป็นตารางอื่นที่มุมมองอ่าน


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
พอลไวท์ 9

คำตอบ:


21

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

นี่คือตัวอย่างย่อ ๆ ที่SELECTยังไม่ได้รับอนุญาตอย่างชัดเจนบนโต๊ะ แต่อยู่ในมุมมอง ผู้ใช้สามารถเลือกจากมุมมอง แต่ไม่ใช่ตาราง

CREATE USER foo WITHOUT LOGIN;
GO
CREATE TABLE dbo.a(id INT);
CREATE TABLE dbo.b(id INT);
GO
CREATE VIEW dbo.v 
AS 
  SELECT a.id FROM a INNER JOIN b ON a.id = b.id;
GO
GRANT SELECT ON dbo.v TO foo;
GO
EXECUTE AS USER = N'foo';
GO
-- works:
SELECT id FROM dbo.v;
GO
-- Msg 229, SELECT denied:
SELECT id FROM dbo.a;
GO
REVERT;

โปรดทราบว่าสิ่งนี้ถือว่าfooยังไม่ได้รับการยกระดับสิทธิ์ผ่านสิทธิ์ที่ชัดเจนในสคีมาหรือฐานข้อมูลหรือผ่านบทบาทหรือการเป็นสมาชิกกลุ่ม

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

สร้างสองฐานข้อมูลและเข้าสู่ระบบ:

CREATE DATABASE d1;
GO
CREATE DATABASE d2;
GO
USE [master];
GO
CREATE LOGIN blat WITH PASSWORD = 'x', CHECK_POLICY = OFF;
GO

ในฐานข้อมูลd1สร้างผู้ใช้จากนั้นสร้างตารางและมุมมองแบบเรียบง่ายกับตารางนั้น ให้สิทธิ์แก่ผู้ใช้เฉพาะกับมุมมอง:

USE d1;
GO
CREATE USER blat FROM LOGIN blat;
GO
CREATE TABLE dbo.t1(id INT);
GO
CREATE VIEW dbo.v1
AS
  SELECT id FROM dbo.t1;
GO
GRANT SELECT ON dbo.v1 TO blat;
GO

d1ตอนนี้ในฐานข้อมูลที่สองสร้างผู้ใช้แล้วสร้างตารางอื่นและมุมมองที่เชื่อมตารางที่ไปที่มุมมองใน ให้สิทธิ์เลือกเฉพาะมุมมอง

USE d2;
GO
CREATE USER blat FROM LOGIN blat;
GO
CREATE TABLE dbo.t2(id INT);
GO
CREATE VIEW dbo.v2
AS
  SELECT v1.id FROM dbo.t2 
    INNER JOIN d1.dbo.v1 AS v1
    ON t2.id = v1.id;
GO
GRANT SELECT ON dbo.v2 TO blat;
GO

ตอนนี้เปิดหน้าต่างแบบสอบถามใหม่และเปลี่ยนข้อมูลประจำตัวที่จะใช้สำหรับการเข้าสู่ระบบblat( EXECUTE ASไม่ทำงานที่นี่) จากนั้นรันสิ่งต่อไปนี้จากบริบทของฐานข้อมูลทั้งสองและควรทำงานได้ดี:

SELECT id FROM d1.dbo.v2;

สิ่งเหล่านี้ควรทำให้เกิดข้อผิดพลาดเกี่ยวกับ msg 229:

SELECT id FROM d1.dbo.t1;
GO
SELECT id FROM d2.dbo.t2;

ผล:

เกี่ยวกับข่าวสาร 229 ระดับ 14 สถานะ 5 บรรทัด 1
สิทธิ์ SELECT ถูกปฏิเสธบนวัตถุ 't1' ฐานข้อมูล 'd1', schema 'dbo'
ข่าวสารเกี่ยวกับ 229 ระดับ 14 สถานะ 5 สาย 3
สิทธิ์ SELECT ถูกปฏิเสธบนวัตถุ 't2' ฐานข้อมูล 'd2' schema 'dbo'


1

คำตอบ wiki ของชุมชนถูกเพิ่มไว้ในคำถามโดยผู้แต่ง:

นี่คือสิ่งที่ฉันทำ:

  1. สร้างมุมมองใน DB A เข้าร่วมตารางทั้งหมดในนั้น
  2. ให้SELECTสิทธิ์การเข้าถึงแก่ผู้ใช้ในมุมมองนั้นและไม่ไปที่ตารางใด ๆ ของผู้ใช้ ผู้ใช้สามารถสืบค้นมุมมองได้สำเร็จไม่ใช่ตาราง
  3. สร้างมุมมองใน DB B เข้าร่วมตารางใน DB นี้พร้อมกับมุมมองใน DB A
  4. ให้SELECTสิทธิ์การเข้าถึงแก่ผู้ใช้ในมุมมองที่สองนี้และไม่รวมอยู่ในตารางใด ๆ ผู้ใช้สามารถสืบค้นมุมมองสุดท้ายและดูข้อมูลได้สำเร็จ

ฉันคิดว่ามันแปลกที่มุมมองสามารถสืบค้นตารางในฐานข้อมูลที่ผู้ใช้ไม่มีการเข้าถึงโดยตรง แต่ไม่สามารถทำได้ในตารางจากฐานข้อมูลอื่น อย่างน้อยก็ใช้งานได้


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