9

のローカル インスタンスを実行していますSQL Server 2012

カスタム ロールを作成しました。

CREATE ROLE [my_user] AUTHORIZATION [dbo]

すべてのユーザー (ローカルの Windows ユーザーと SQL ユーザー) に対して、データベースにこのロールを (User Mappings設定で) 指定しました。したがって、次のクエリは 1 を返す必要があります。

SELECT IS_ROLEMEMBER('my_user')

私の Windows 認証ユーザーの場合、実際には 1 が返されますが、SQL ユーザーとしてログオンするとすぐに 0 が返されます。SQL ユーザーが実際にこの役割を持っていることを 3 回確認しました。ここで何が欠けていますか?

アップデート

さらにいくつかのテストを実行しました。これは確かに奇妙な動作です。次の手順を実行しました。

  1. 私のローカルでは、 userSQL Serverでデータベースを作成しました。ロールが追加されました。testsamy_user
  2. としてログオンし、saこの役割Management Studioに追加されました。MYDOMAIN\MyUser
  3. Windows認証で再ログオンし、実行しIS_ROLEMEMBER('my_user')ました。0 を返します。
  4. sa(ユーザー名を指定して) と Windows ユーザーの両方を使用してクエリを試行しました。同じ問題。
  5. 念のため再起動してみSQL Serverました。

これは意味がありません!ロールを右クリックすると、自分の Windows ユーザーが実際にロールのメンバーであることがわかります。IS_ROLEMEMBER機能がおかしい!次のクエリを実行すると、ユーザーが実際にデータベース ロールのメンバーであることが示されます。

SELECT
    USER_NAME(memberuid), USER_NAME(groupuid)
FROM
    sys.sysmembers
WHERE
    USER_NAME(groupuid) = 'my_user'

これは私のメンバーシップも示しています:

select r.name as role_name, m.name as member_name from sys.database_role_members rm 
inner join sys.database_principals r on rm.role_principal_id = r.principal_id
inner join sys.database_principals m on rm.member_principal_id = m.principal_id

いくつかの追加情報:

  • ドメインに参加していますが、現在切断されています。ただし、接続時にもこの問題が発生しました。
  • Windows 8.1 64 ビットを実行しています。

更新 2

一部の人が示唆しているようにプリンシパルを明示的に指定すると、次のエラーが発生します (executing as sa):

SELECT IS_ROLEMEMBER('my_user', 'MYDOMAIN\UserX')

Msg 15404, Level 16, State 19, Line 1
Could not obtain information about Windows NT group/user 'MYDOMAIN\UserX',
error code 0x54b.

同じ問題が発生している可能IS_ROLEMEMBER性がありますが、エラーは出力されませんか?

4

3 に答える 3

8

これと同じ問題が発生しました...問題のユーザーには、サーバーの役割も割り当てられていることがわかりました。「パブリック」以外のすべてのサーバー ロールを削除すると、突然、is_rolemember クエリがゼロではなく 1 を正しく報告し始めました.....これを数回行ったり来たりして確認しました。

于 2014-11-26T18:56:38.320 に答える
3

プリンシパルを明示的に指定してみてください。

SELECT IS_ROLEMEMBER('my_user', 'SqlLogin')

これをテストしたところ、1 が返されました。

CREATE DATABASE TestDatabase;
GO

USE TestDatabase;
GO

CREATE ROLE TestRole AUTHORIZATION dbo;
GO

CREATE USER TestUser WITHOUT LOGIN;
GO

EXEC sp_addrolemember 'TestRole', 'TestUser';
GO

SELECT IS_ROLEMEMBER('TestRole', 'TestUser');
GO
于 2013-11-15T21:24:09.780 に答える
3

この問題もありました。sysadminサーバーの役割を削除する必要があったことがわかりましたが、それはうまくいきました。

これは、https ://docs.microsoft.com/en-us/sql/t-sql/functions/is-member-transact-sql から取得したものです。

sysadmin 固定サーバー ロールのメンバーは、dbo ユーザーとしてすべてのデータベースに入ります。sysadmin 固定サーバー ロールのメンバーのアクセス許可を確認すると、元のログインではなく、dbo のアクセス許可が確認されます。dbo はデータベース ロールに追加できず、Windows グループにも存在しないため、dbo は常に 0 (ロールが存在しない場合は NULL) を返します。

于 2017-11-03T10:10:15.597 に答える