से प्रलेखन :
- यद्यपि डेटाबेस तक पहुंच वाला कोई भी उपयोगकर्ता आरेख बना सकता है, एक बार आरेख बनाने के बाद, केवल उपयोगकर्ता जो इसे देख सकते हैं, वे आरेख के निर्माता और 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
आरेखों की प्रतियों का एक पूरा समूह एकत्र करेगा, जो शायद आवश्यक नहीं है, लेकिन आप शायद उन परिस्थितियों में "मास्टर" बनना चाहते हैं।