डेटाबेस आरेख देखने के लिए अनुमति आवश्यक है


10

मैंने हाल ही में हमारे डेवलपर्स के उपयोग के लिए SSDT की स्थापना की है। हम अपने देव डेटाबेस में बदलाव को लागू करते हैं SSDT के माध्यम से उन अनुमतियों को सीमित करके बनाया जाता है जो प्रत्येक डेवलपर्स के सर्वर से जुड़े होने पर होती हैं (db_datareader, db_datawriter)। SSDT के भीतर हम एक तैनाती स्क्रिप्ट का उपयोग करके डेटाबेस में हमारे परिवर्तन प्रकाशित करते हैं जो उन्नत अनुमतियों के साथ लॉग का उपयोग करके जोड़ता है।

मेरा प्रश्न। यह देखते हुए कि हम डेटाबेस को लॉक करने के लिए (स्कीमा बहाव को रोकने के लिए) इस लंबाई पर गए हैं; क्या कोई ऐसा तरीका है जिससे डेवलपर्स इस डेटाबेस पर आरेखों को बिना db_owner की अनुमति के देख सकते हैं? मुझे पता है कि प्रत्येक डेवलपर अपने या अपने स्वयं के आरेख बना सकता है और देख सकता है, लेकिन मैं चाहता हूं कि वे सभी आरेखों को देख सकें, जो कई अलग-अलग डेवलपर्स द्वारा बनाए गए हैं।

मुझे नहीं लगता कि इससे मदद मिलेगी लेकिन हम sql सर्वर 2012 चला रहे हैं

कोई मदद बहुत प्राप्त होगी।

जवाबों:


16

से प्रलेखन :

  • यद्यपि डेटाबेस तक पहुंच वाला कोई भी उपयोगकर्ता आरेख बना सकता है, एक बार आरेख बनाने के बाद, केवल उपयोगकर्ता जो इसे देख सकते हैं, वे आरेख के निर्माता और db_owner भूमिका के किसी भी सदस्य हैं।
  • आरेख का स्वामित्व केवल db_owner भूमिका के सदस्यों को हस्तांतरित किया जा सकता है। यह केवल तभी संभव है जब आरेख के पिछले मालिक को डेटाबेस से हटा दिया गया हो।
  • यदि आरेख का स्वामी डेटाबेस से हटा दिया गया है, तो आरेख डेटाबेस में तब तक रहेगा जब तक db_owner भूमिका का कोई सदस्य इसे खोलने का प्रयास नहीं करता। उस बिंदु पर db_owner सदस्य आरेख के स्वामित्व को लेने का विकल्प चुन सकता है।

तो ऐसा लगता है कि आप इसे कम भूमिकाओं के साथ नहीं कर पाएंगे db_datareader

पर्दे के पीछे, प्रबंधन स्टूडियो इस सूची को चलाने के लिए कह रहा है:

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

आरेखों के एक जोड़े को बनाने के बाद, इन उपयोगकर्ताओं के लिए ऑब्जेक्ट एक्सप्लोरर का एक संक्षिप्त संस्करण कैसा दिखता है:

यहाँ छवि विवरण दर्ज करें

अब, dboआरेखों की प्रतियों का एक पूरा समूह एकत्र करेगा, जो शायद आवश्यक नहीं है, लेकिन आप शायद उन परिस्थितियों में "मास्टर" बनना चाहते हैं।


बहुत गहन। लगता है कि मैं अपने अंतिम सुझाव एक कोशिश दे देंगे। बहुत बहुत धन्यवाद
स्टीव


@LowlyDBA डेटाबेस डायग्राम को SSMS 18.1
जेरेमी कुक

0

BOL के अनुसार , डेटाबेस स्वामी dbo विशेषाधिकारों के साथ एक खाते की आवश्यकता है। अधिक जानकारी यहाँ

तो, उपयोगकर्ता जिसने इसे बनाया है, या db_owner भूमिका का सदस्य आरेख खोल सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.