ต้องได้รับอนุญาตก่อนเพื่อดูไดอะแกรมฐานข้อมูล


10

ฉันเพิ่งตั้งค่า SSDT เพื่อให้นักพัฒนาของเราใช้ เราบังคับใช้การเปลี่ยนแปลงฐานข้อมูล dev ของเราทำผ่าน SSDT โดย จำกัด สิทธิ์ที่นักพัฒนาแต่ละคนมีเมื่อเชื่อมต่อกับเซิร์ฟเวอร์ (db_datareader, db_datawriter) ภายใน SSDT เราเผยแพร่การเปลี่ยนแปลงของเราไปยังฐานข้อมูลโดยใช้สคริปต์การปรับใช้ซึ่งเชื่อมต่อโดยใช้การเข้าสู่ระบบด้วยสิทธิ์ระดับสูง

คำถามของฉัน. เนื่องจากเราได้ใช้ความยาวนี้เพื่อล็อกฐานข้อมูล (เพื่อหยุดการเลื่อนสคีมา); มีวิธีใดบ้างที่นักพัฒนาสามารถดูไดอะแกรมในฐานข้อมูลนี้โดยไม่ต้องมีสิทธิ์ db_owner? ฉันรู้ว่านักพัฒนาซอฟต์แวร์แต่ละคนสามารถสร้างและดูไดอะแกรมของเขาหรือเธอได้ แต่ฉันต้องการให้พวกเขาสามารถดูไดอะแกรมทั้งหมดที่สร้างขึ้นโดยนักพัฒนาหลายคน

ฉันไม่คิดว่ามันจะช่วยได้ แต่เรากำลังเรียกใช้ sql server 2012

ความช่วยเหลือใด ๆ จะได้รับอย่างมาก

คำตอบ:


16

จากเอกสารประกอบ :

  • แม้ว่าผู้ใช้ใด ๆ ที่มีการเข้าถึงฐานข้อมูลสามารถสร้างไดอะแกรมได้เมื่อสร้างไดอะแกรมแล้วผู้ใช้เท่านั้นที่สามารถเห็นไดอะแกรมนั้นก็คือผู้สร้างไดอะแกรมและสมาชิกของบทบาท 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จะรวบรวมสำเนาทั้งหมดของไดอะแกรมซึ่งอาจไม่จำเป็น แต่คุณอาจต้องการให้มันเป็น "ปรมาจารย์" ในสถานการณ์ส่วนใหญ่


ถี่ถ้วนมาก คิดว่าฉันจะลองทำข้อเสนอแนะล่าสุดของคุณ ขอบคุณมาก
Steve

สำหรับทุกคนที่เจอสิ่งนี้เมื่อเร็ว ๆ นี้ในฐานะของแผนภาพฐานข้อมูล SSMS 18 (ดูตัวอย่าง) เป็นคุณลักษณะที่เลิกใช้แล้ว
LowlyDBA

@LowlyDBA ฐานข้อมูลไดอะแกรมถูกเพิ่มกลับเข้าไปในSSMS 18.1
Jeremy Cook

0

ตามBOL ต้องมีบัญชีที่มีสิทธิ์ฐานข้อมูลเป็นเจ้าของ dbo ข้อมูลเพิ่มเติมที่นี่

ดังนั้นผู้ใช้ที่สร้างมันขึ้นมาหรือสมาชิกของบทบาท db_owner สามารถเปิดไดอะแกรม

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