web-dev-qa-db-ja.com

SSMSのセキュリティ保護可能なGUIに重複したアクセス許可が表示されるのはなぜですか?

セキュリティ保護可能なGUIに重複したアクセス許可が表示されるのはなぜですか?

enter image description here

8
Shawn H

異なる「許可者」から同じ許可を複数回付与できるため、複数のエントリがあります。そのプリンシパル(「被付与者」)が2人の付与者から同じ許可をすでに付与されている場合は、この画面に同じ許可の3つのエントリが表示されます。

表示されている「重複」エントリの場合、「Grantor」列が空のエントリを使用して、同じ権限の他のエントリにリストされているものとは異なる権限付与者から同じ権限を割り当てることができます(この場合は:dbo)。もちろん、プリンシパルとして接続しているときに、同じ付与者に対して何が許可されたアクセス許可を既に持っている追加のエントリがあるのか​​はわかりません。付与者ごとに1行しか持てないためです。たとえば、「付与あり」オプションを「dbo」に変更すると、「付与者」=「dbo」のエントリが更新されます。接続と同じプリンシパルに空でない「Grantor」行がある場合、GUIは接続をチェックして空の行を除外しないと思います。次に、再びwould空の行があることは理にかなっていますifこれは、「Grantor」セルがプリンシパルのドロップダウンであり、使用するプリンシパルを選択できるようにしますASステートメントのGRANT句はそうではありませんが、そうではないため、空の行を使用することは実際的ではありません。

次のことを試して、この動作を確認してください。

USE [tempdb];

CREATE USER [GrantPark] WITHOUT LOGIN;
CREATE USER [GrantWard] WITHOUT LOGIN;


CREATE TABLE dbo.MultiplePermissionsTest (Col1 INT);

SELECT dp.[permission_name], dp.state_desc, USER_NAME(dp.grantee_principal_id)
       AS [Grantee], USER_NAME(dp.grantor_principal_id) AS [Grantor]
FROM   sys.database_permissions dp
WHERE  OBJECT_NAME(dp.major_id) = N'MultiplePermissionsTest';


GRANT SELECT ON dbo.MultiplePermissionsTest TO [GrantPark] WITH GRANT OPTION;

SELECT dp.[permission_name], dp.state_desc, USER_NAME(dp.grantee_principal_id)
       AS [Grantee], USER_NAME(dp.grantor_principal_id) AS [Grantor]
FROM   sys.database_permissions dp
WHERE  OBJECT_NAME(dp.major_id) = N'MultiplePermissionsTest';


GRANT SELECT ON dbo.MultiplePermissionsTest TO [GrantWard];

SELECT dp.[permission_name], dp.state_desc, USER_NAME(dp.grantee_principal_id)
       AS [Grantee], USER_NAME(dp.grantor_principal_id) AS [Grantor]
FROM   sys.database_permissions dp
WHERE  OBJECT_NAME(dp.major_id) = N'MultiplePermissionsTest';


GRANT SELECT ON dbo.MultiplePermissionsTest TO [GrantWard] AS [GrantPark];

SELECT dp.[permission_name], dp.state_desc, USER_NAME(dp.grantee_principal_id)
       AS [Grantee], USER_NAME(dp.grantor_principal_id) AS [Grantor]
FROM   sys.database_permissions dp
WHERE  OBJECT_NAME(dp.major_id) = N'MultiplePermissionsTest';

戻り値:

permission_name    state_desc                 Grantee      Grantor
(no rows)


permission_name    state_desc                 Grantee      Grantor
SELECT             GRANT_WITH_GRANT_OPTION    GrantPark    dbo


permission_name    state_desc                 Grantee      Grantor
SELECT             GRANT_WITH_GRANT_OPTION    GrantPark    dbo
SELECT             GRANT                      GrantWard    dbo


permission_name    state_desc                 Grantee      Grantor
SELECT             GRANT_WITH_GRANT_OPTION    GrantPark    dbo
SELECT             GRANT                      GrantWard    dbo
SELECT             GRANT                      GrantWard    GrantPark

次に、SSMSに移動して[システムデータベース]フォルダーを展開し、[tempdb]に移動してから、[テーブル]に移動します。 "dbo.MultiplePermissionsTest"を右クリックして、[プロパティ]、[許可]の順に移動し、[許可]を選択します。少し下にスクロールすると、「選択」の3行が表示され、それぞれ「付与者」の値が異なります:(空)、dbo、およびGrantPark

11
Solomon Rutzky