2017-07-25 36 views
0

ユーザーがロールDatabaseMailUserRoleを持っているかどうかを確認する必要があります。IS_ROLEMEMBERが正常に動作しない

私はこれを試してみました:

SELECT IS_MEMBER('DatabaseMailUserRole') 

SELECT IS_ROLEMEMBER ('DatabaseMailUserRole', '<loginname>') 

両方correctincorrectのいずれかの値を返します。

これは、いくつかのログインでは正しい値を返しますが、他のログインではそうでないことを意味します。

+2

これはどのRDBMSですか? 'mysql'、' postgresql'、 'sql-server'、' oracle'、 'db2'のどれかを指定するタグを追加してください。 –

+1

私の知る限り、DatabaseMailUserRoleはSQLサーバです。もしそうなら、sql-serverでタグ付けしてください。 –

答えて

0

DatabaseMailUserRoleは、私が知っているものからSQL Serverです。あなたのロジックの問題は、DatabaseMailUserRoleがデータベースロールであるため、ユーザーにマップされ、ではなくログインになります。

ユーザー(データベースレベル)とログイン(サーバーレベル)は異なるオブジェクトサーバー上のデータベースにアクセスするには、ユーザーはログイン名とユーザー名の両方が必要です。ログインとユーザーオブジェクト同じ人のためかもしれないが、そのため IS_ROLEMEMBERは、以下のように引数/ wを呼び出さなければならない、例えば

同じ名前を共有する

CREATE USER someuser FROM LOGIN 'domain\login'; 
GO 
EXEC sp_addrolemember 'DatabaseMailUserRole','someuser'; 
GO 

/* the following will fail because only users can be added to database role DatabaseMailUserRole */ 
EXEC sp_addrolemember 'DatabaseMailUserRole','domain\login'; 
GO 


EXECUTE AS login = 'domain\login' 
SELECT IS_MEMBER('DatabaseMailUserRole') -> true 

/* login 'domain\login' has username someuser */ 

SELECT CURRENT_USER -> 'someuser' 
SELECT SYSTEM_USER -> 'domain\login' 


SELECT IS_ROLEMEMBER ('DatabaseMailUserRole', 'domain\login') -> NULL 
SELECT IS_ROLEMEMBER ('DatabaseMailUserRole', 'someuser') -> True 

を必要とされていません。

サーバーレベルのログインを同じ名前のデータベースレベルのユーザーにマップできるため、ログイン名を使用して正しい結果が得られる場合があります。

+0

実際には、データベースに対するテスト済みのすべてのログインに対してユーザーが作成されていることが保証されています。 –

+0

また、ssmsでログインを開くと、DatabaseMailUserRoleがdbのユーザに設定されていることがわかります。 –

+0

そして、ログイン名ではなくユーザー名をIS_ROLEMEMBERに渡していますか?あなたが既にこれをチェックしていればうれしいですが、あなたのコードはあなたがログイン名を渡していることを意味します。より多くの研究をする前に単純なものを取り除きたい。 –

関連する問題