データベースダイアグラムを表示するために必要な権限


10

最近、開発者が使用できるようにSSDTを設定しました。開発者データベースへの変更は、サーバー(db_datareader、db_datawriter)に接続したときに各開発者が持つ権限を制限することにより、SSDTを介して行われます。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テーブル自体(実際にはシステムテーブルではない)でトリガーを使用し、ダイアグラムが作成または更新されるたびに、プリンシパルごとに(ユーザー名を追加して)コピーを追加/更新します。どちらも最適ではなく、1日中人々がお互いの図を上書きする可能性があります。

ここに2番目の回避策のアイデアがあります-ここで実際に維持する必要があるのは、ダイアグラムにアクセスできるようにするデータベースプリンシパルのリストだけです(削除されたダイアグラムをクリーンアップするための何かも必要になるでしょう) 、また、削除されたプリンシパルの図を削除する定期的なメンテナンス):

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ダイアグラムのコピーの束全体が収集されます。これはおそらく必要ないかもしれませんが、ほとんどの場合、それらを「マスター」にしたいと思うでしょう。


非常に徹底しています。私はあなたの最後の提案を試してみると思います。どうもありがとう
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.