จากเอกสารประกอบ :
- แม้ว่าผู้ใช้ใด ๆ ที่มีการเข้าถึงฐานข้อมูลสามารถสร้างไดอะแกรมได้เมื่อสร้างไดอะแกรมแล้วผู้ใช้เท่านั้นที่สามารถเห็นไดอะแกรมนั้นก็คือผู้สร้างไดอะแกรมและสมาชิกของบทบาท db_owner
- ความเป็นเจ้าของไดอะแกรมสามารถถ่ายโอนไปยังสมาชิกของบทบาท db_owner เท่านั้น สิ่งนี้เป็นไปได้ก็ต่อเมื่อเจ้าของแผนภาพก่อนหน้านี้ถูกลบออกจากฐานข้อมูล
- หากเจ้าของไดอะแกรมถูกลบออกจากฐานข้อมูลไดอะแกรมจะยังคงอยู่ในฐานข้อมูลจนกว่าสมาชิกของบทบาท db_owner จะพยายามเปิด ณ จุดนี้สมาชิก db_owner สามารถเลือกที่จะครอบครองความเป็นเจ้าของไดอะแกรม
db_datareader
ดังนั้นจึงดูเหมือนว่าคุณจะไม่สามารถที่จะทำกับบทบาทที่ต่ำกว่าเช่น
เบื้องหลังนี่คือสิ่งที่ Management Studio เรียกเพื่อผลักดันรายการ:
CREATE PROCEDURE dbo.sp_helpdiagrams
(
@diagramname sysname = NULL,
@owner_id int = NULL
)
WITH EXECUTE AS N'dbo'
AS
BEGIN
DECLARE @user sysname
DECLARE @dboLogin bit
EXECUTE AS CALLER;
SET @user = USER_NAME();
SET @dboLogin = CONVERT(bit,IS_MEMBER('db_owner'));
REVERT;
SELECT
[Database] = DB_NAME(),
[Name] = name,
[ID] = diagram_id,
[Owner] = USER_NAME(principal_id),
[OwnerID] = principal_id
FROM
sysdiagrams
WHERE
(@dboLogin = 1 OR USER_NAME(principal_id) = @user) AND
(@diagramname IS NULL OR name = @diagramname) AND
(@owner_id IS NULL OR principal_id = @owner_id)
ORDER BY
4, 5, 1
END
ดังนั้นคุณจะเห็นสิ่งนี้ตรงกับเอกสารประกอบ
ตอนนี้ความคิดการแก้ปัญหาสองสาม:
- ในทริกเกอร์เข้าสู่ระบบอัปเดต
principal_id
ของทุกแผนภาพที่จะเข้าสู่ระบบในปัจจุบัน ซึ่งหมายความว่าพวกเขาจะสามารถเข้าถึงไดอะแกรมทั้งหมดจนกว่าบุคคลอื่นจะเข้าสู่ระบบไม่เหมาะสม
- ใช้ทริกเกอร์บน
sysdiagrams
ตาราง (ไม่ใช่ตารางระบบจริง ๆ ) และเมื่อใดก็ตามที่สร้างหรือปรับปรุงไดอะแกรมให้เพิ่ม / อัปเดตสำเนาสำหรับเงินต้นแต่ละรายการ (พร้อมชื่อผู้ใช้ต่อท้าย) ไม่เหมาะสมเช่นกันและคุณอาจให้คนเขียนทับไดอะแกรมของกันและกันตลอดทั้งวัน
นี่คือแนวคิดของวิธีแก้ปัญหาที่สอง - สิ่งที่คุณต้องเก็บรักษาไว้ที่นี่คือรายการของฐานข้อมูลที่คุณต้องการเข้าถึงไดอะแกรม (คุณจะต้องมีบางสิ่งในการล้างไดอะแกรมที่ถูกลบไปแล้ว และยังมีการบำรุงรักษาตามระยะเวลาที่ลบไดอะแกรมสำหรับหลักการที่ถูกลบไปด้วย):
CREATE TRIGGER dbo.sysdiagrams_distribute
ON dbo.sysdiagrams
WITH EXECUTE AS N'dbo'
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @p TABLE(principal_id INT, name SYSNAME);
INSERT @p SELECT principal_id, name
FROM sys.database_principals
-- change this list:
WHERE name IN (N'test_blat_user', N'test_blat_user2', N'dbo');
UPDATE d
SET [version] = i.version, definition = i.definition
FROM inserted AS i
CROSS JOIN @p AS p
INNER JOIN dbo.sysdiagrams AS d
ON d.name = i.name
AND d.principal_id = p.principal_id;
INSERT dbo.sysdiagrams(name, principal_id, version, definition)
SELECT i.name, p.principal_id, i.version, i.definition
FROM inserted AS i
CROSS JOIN @p AS p
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.sysdiagrams WHERE name = i.name
AND principal_id = p.principal_id
);
END
GO
หลังจากสร้างไดอะแกรมสองสามอันต่อไปนี้เป็นสิ่งที่ผู้ใช้เหล่านี้มองหา Object ย่อรุ่นย่อ:
ตอนนี้dbo
จะรวบรวมสำเนาทั้งหมดของไดอะแกรมซึ่งอาจไม่จำเป็น แต่คุณอาจต้องการให้มันเป็น "ปรมาจารย์" ในสถานการณ์ส่วนใหญ่