2016-06-27 2 views
0

Ich habe zwei Logins login1 und login2. login1 hat sysadmin Server-Rolle und ich möchte login2 einige Berechtigungen bedingt im Kontext von login1 gewähren.Wie eine Berechtigung zu einer Anmeldung hinzufügen, wenn es nicht in SQL Server ist?

Nach etwas googeln fand ich die Funktion HAS_PERMS_BY_NAME kann verwendet werden, um zu testen, ob ein Benutzer (aktueller Benutzer) eine Berechtigung hat. Also schrieb ich den folgenden Code:

EXECUTE AS LOGIN = 'login2'; 
IF HAS_PERMS_BY_NAME(NULL, NULL, 'VIEW DEFINITION') != 1 
    GRANT VIEW ANY DEFINITION TO login2; 

IF HAS_PERMS_BY_NAME(NULL, NULL, 'VIEW SERVER STATE') != 1 
    GRANT VIEW SERVER STATE TO login2; 
REVERT; 

Aber ich bekam die folgende Fehlermeldung, wenn ich es ausgeführt:

Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself. 

, die angemessen ist, weil ich Berechtigungen im Kontext der login2 Gewährung, die nicht ist richtig. Also änderte ich meinen Code wie folgt:

EXECUTE AS LOGIN = 'login2'; 
IF HAS_PERMS_BY_NAME(NULL, NULL, 'VIEW DEFINITION') != 1 
BEGIN 
    REVERT; 
    GRANT VIEW ANY DEFINITION TO login2; 
END 

EXECUTE AS LOGIN = 'login2'; 
IF HAS_PERMS_BY_NAME(NULL, NULL, 'VIEW SERVER STATE') != 1 
BEGIN 
    REVERT; 
    GRANT VIEW SERVER STATE TO login2; 
END 

Aber immer noch habe ich genau die gleiche Fehlermeldung, wenn ich es ausgeführt habe. Kann mir jemand helfen, mir die richtige Richtung zu zeigen? Vielen Dank.

+0

Try 'ausführen als user =‚login2'' nicht 'als login' – artm

Antwort

1
CREATE TABLE #temp (permission VARCHAR(20)) 

EXECUTE AS USER = 'login2'; 

INSERT INTO #temp SELECT permission_name FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name = 'VIEW DEFINITION'; 

REVERT 
GO 

IF NOT EXISTS (SELECT * FROM #temp) 
    GRANT VIEW ANY DEFINITION TO login2; 

DROP TABLE #temp 
GO 

CREATE TABLE #temp (permission VARCHAR(20)) 

EXECUTE AS USER = 'login2'; 

INSERT INTO #temp SELECT permission_name FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name = 'VIEW SERVER STATE'; 

REVERT 
GO 

IF NOT EXISTS (SELECT * FROM #temp) 
    GRANT VIEW ANY DEFINITION TO login2; 

DROP TABLE #temp 
Verwandte Themen