หากคุณต้องการให้ผู้ใช้เลือกจากมุมมองเหตุใดคุณจึงให้สิทธิ์แก่ตาราง โดย "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'