একটি ডাটাবেস ডায়াগ্রাম দেখার অনুমতি প্রয়োজন


10

আমাদের বিকাশকারীদের ব্যবহারের জন্য আমি সম্প্রতি এসএসডিটি স্থাপন করেছি। আমরা সার্ভারের সাথে সংযুক্ত হওয়ার সময় প্রতিটি ডেভেলপারদের অনুমতি সীমাবদ্ধ করে এসএসডিটি-র মাধ্যমে আমাদের ডেভ ডাটাবেসে পরিবর্তনগুলি প্রয়োগ করি (db_datareader, db_datawriter)। এসএসডিটি-র মধ্যে আমরা একটি পরিবর্তন স্ক্রিপ্ট ব্যবহার করে ডাটাবেসে আমাদের পরিবর্তনগুলি প্রকাশ করি যা উন্নত অনুমতি নিয়ে লগ-ইন ব্যবহার করে সংযুক্ত হয়।

আমার প্রশ্ন. প্রদত্ত যে আমরা ডাটাবেস লক করতে এই দৈর্ঘ্যে চলেছি (স্কিমা প্রবাহ বন্ধ করতে); বিকাশকারীরা db_owner অনুমতি না নিয়ে এই ডাটাবেসে ডায়াগ্রামগুলি কীভাবে দেখতে পাচ্ছেন? আমি জানি যে প্রতিটি বিকাশকারী তার নিজস্ব ডায়াগ্রাম তৈরি করতে এবং দেখতে পারে তবে আমি চাই যে তারা সমস্ত চিত্রটি দেখতে সক্ষম হবে যা বিভিন্ন বিকাশকারী তৈরি করেছেন।

আমি মনে করি না এটি সাহায্য করবে তবে আমরা স্কিল সার্ভার 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এর সব বর্তমান লগইন হিসাবে ডায়াগ্রামে। এর অর্থ পরবর্তী ব্যক্তি লগ ইন না করা পর্যন্ত তাদের সমস্ত চিত্রগুলিতে অ্যাক্সেস থাকবে ti অনুকূল নয়।
  • sysdiagramsটেবিলটিতে নিজেই একটি ট্রিগার ব্যবহার করুন (এটি আসলে কোনও সিস্টেমের টেবিল নয়) এবং যখনই কোনও চিত্র তৈরি করা বা আপডেট করা হয় তখন প্রতিটি অধ্যক্ষের জন্য একটি কপি যুক্ত / আপডেট করুন (তাদের ব্যবহারকারীর নাম সংযুক্ত) app কোনওটিই অনুকূল নয়, এবং আপনার লোকেরা সারা দিন একে অপরের ডায়াগ্রামগুলি ওভাররাইট করতে পারে।

এখানে দ্বিতীয় কার্যবিধির একটি ধারণা দেওয়া হয়েছে - আপনাকে এখানে যা ঠিক রাখতে হবে তা হ'ল ডাটাবেস প্রিন্সিপালের একটি তালিকা যা আপনি ডায়াগ্রামগুলি অ্যাক্সেস করতে সক্ষম হতে চান (ডায়াগ্রামগুলি মুছে ফেলার জন্য আপনার কাছে কিছু থাকতে হবে) , এবং কিছু পর্যায়ক্রমিক রক্ষণাবেক্ষণ যা মুছে ফেলা হয়েছে এমন প্রিন্সিপালের জন্য চিত্রগুলি মুছে দেয়):

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ডায়াগ্রামের সম্পূর্ণ কপিগুলি সংগ্রহ করবে, যা সম্ভবত প্রয়োজনীয় নয়, তবে আপনি সম্ভবত চান যে এগুলি বেশিরভাগ ক্ষেত্রে "মাস্টার" হতে পারে।


খুব বিস্তারিত. মনে করি আমি আপনার শেষ পরামর্শটি চেষ্টা করে দেব। অনেক অনেক ধন্যবাদ
স্টিভ


@ লোলিডিবিএ ডেটাবেস ডায়াগ্রামগুলি এসএসএমএসে আবার যুক্ত করা হয়েছিল 18.1
জেরেমি কুক

0

অনুযায়ী BOL , ডাটাবেজ মালিক dbo বিশেষাধিকার একটি একাউন্ট প্রয়োজন। আরও তথ্য এখানে

সুতরাং, যে ব্যবহারকারী এটি তৈরি করেছেন বা db_owner রোলের কোনও সদস্য ডায়াগ্রাম খুলতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.