Является ли 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 действительно имеет эту роль. Я что-то упускаю?
обновление
выполнил еще несколько тестов. Это определенно странное поведение. Я выполнил следующие шаги:
- на
SQL Server
Я создал базу данныхtest
С . Рольmy_user
добавил. - войти в систему в качестве
sa
наManagement Studio
и добавилMYDOMAINMyUser
на эту роль. - повторно вошел в систему с проверкой подлинности Windows и казнен
IS_ROLEMEMBER('my_user')
. возвращает 0. - попробовал запрос, используя как
sa
(указание имени пользователя) и пользователя Windows. Та же проблема. - хорошем
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