Antworten:
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 AS
Klausel der GRANT
Anweisung 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
.