Является ли ROLEMEMBER ошибочно возвращает 0 для членов роли базы данных?

запуск локального экземпляра SQL Server 2012.

я создал пользовательскую роль:

CREATE ROLE [my_user] AUTHORIZATION [dbo]

для всех моих пользователей (локальных пользователей Windows и пользователей SQL) я указал эту роль для своей базы данных (под User Mappings настройки). Таким образом, следующий запрос должен вернуть 1:

SELECT IS_ROLEMEMBER('my_user')

для моих пользователей с проверкой подлинности Windows он действительно возвращает 1, но как только я вошел в систему как пользователь SQL, это возвращает 0. У меня есть трижды проверено, что пользователь SQL действительно имеет эту роль. Я что-то упускаю?

обновление

выполнил еще несколько тестов. Это определенно странное поведение. Я выполнил следующие шаги:

  1. на SQL Server Я создал базу данных test С . Роль my_user добавил.
  2. войти в систему в качестве sa на Management Studio и добавил MYDOMAINMyUser на эту роль.
  3. повторно вошел в систему с проверкой подлинности Windows и казнен IS_ROLEMEMBER('my_user'). возвращает 0.
  4. попробовал запрос, используя как sa (указание имени пользователя) и пользователя Windows. Та же проблема.
  5. хорошем SQL Server на всякий случай.

это не имеет смысла! если я щелкните правой кнопкой мыши роль, я вижу, что мой пользователь Windows действительно является ее членом. The

3 ответов


У меня была такая же проблема... Я обнаружил, что у пользователя, о котором идет речь, также были назначены роли сервера. Когда я удалил все роли сервера, кроме "public", внезапно запрос is_rolemember начал правильно сообщать 1 вместо нуля..... Я проверил это несколько раз, чтобы убедиться.


также была эта проблема. Оказывается, мне пришлось удалить роль сервера sysadmin, тогда это сработало.

Это взято из: https://docs.microsoft.com/en-us/sql/t-sql/functions/is-member-transact-sql

члены предопределенной роли сервера sysadmin вводят каждую базу данных в качестве пользователя dbo. Проверка разрешений для члена предопределенной роли сервера sysadmin проверяет разрешения для dbo, а не для исходного имени входа. Поскольку dbo нельзя добавить в роль базы данных и не существует в группах Windows, dbo всегда будет возвращать 0 (или NULL, если роль не существует).


попробуйте явно указать на основные.

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