2016-06-27 8 views
0

私は2つのログインがありますlogin1login2です。 login1にはsysadminというサーバーロールがあり、login2に条件付きでいくつかのアクセス許可をlogin1のコンテキストで付与したいとします。ログインに権限を追加するには、SQL Serverに権限がない場合はどうすればいいですか?

グーグルでは、ユーザー(現在のユーザー)に何らかの許可があるかどうかをテストするために、HAS_PERMS_BY_NAMEを使用することができます。だから私は、次のコードを書いた:

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; 

をしかし、私はそれを実行したとき、私は、次のエラーを得た:私はないですlogin2の文脈、下の権限を付与していますので、合理的だ

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

正しい。だから私はコードを変更しました:

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 

私はそれを実行すると、まったく同じエラーメッセージが表示されます。誰でも私の正しい方向性を指すのに役立ちますか?ありがとう。

+0

=「login2''ない 'login'などのユーザーとして実行してみ' – artm

答えて

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 
関連する問題