Warum werden doppelte Berechtigungen auf der Securables-GUI in SSMS angezeigt?

Antworten:

11

Es gibt mehrere Einträge, da Sie dieselbe Berechtigung mehrmals von verschiedenen "Grantoren" erhalten können. Wenn diesem Auftraggeber (dh dem "Berechtigten") bereits dieselbe Berechtigung von zwei Berechtigten erteilt wurde, werden auf diesem Bildschirm drei Einträge für dieselbe Berechtigung angezeigt.

Für die "doppelten" Einträge, die Sie sehen, kann der mit der leeren Spalte "Grantor" verwendet werden, um dieselbe Berechtigung von einem anderen Grantor zuzuweisen als der im anderen Eintrag für dieselbe Berechtigung aufgeführte (in diesem Fall ist dies der Fall) :) dbo. Natürlich bin ich mir nicht sicher, warum es diesen zusätzlichen Eintrag gibt, wenn Sie als Principal verbunden sind und bereits eine erteilte Berechtigung für denselben Grantor haben, da Sie nur eine Zeile pro Grantor haben können. Wenn Sie beispielsweise die Option "Mit Grant" in "dbo" ändern, wird einfach der Eintrag für "Grantor" = "dbo" aktualisiert. Ich denke, die GUI überprüft die Verbindung nicht, um die leeren Zeilen herauszufiltern, wenn es eine nicht leere "Grantor" -Zeile für denselben Principal wie die Verbindung gibt. Dann wieder,In der Zelle "Grantor" handelte es sich um eine Dropdown-Liste von Principals, mit deren Hilfe eine in der ASKlausel der GRANTAnweisung verwendete ausgewählt werden konnte. Dies ist jedoch nicht der Fall. Daher scheint es eher verwirrend als praktisch, die leere Zeile zu haben.

Versuchen Sie Folgendes, um dies in Aktion zu sehen:

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';

Kehrt zurück:

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

Gehen Sie nun zu SSMS und erweitern Sie den Ordner "Systemdatenbanken", gehen Sie zu "tempdb" und dann zu "Tabellen". Klicken Sie mit der rechten Maustaste auf "dbo.MultiplePermissionsTest" und gehen Sie zu "Eigenschaften", dann zu "Berechtigungen" und wählen Sie "GrantWard". Scrollen Sie ein wenig nach unten und Sie sollten 3 Zeilen für "Auswählen" sehen, jede mit einem anderen Wert für "Grantor": (leer) dbo, und GrantPark.

Solomon Rutzky
quelle