#sql-server #permissions #alter #grant
#sql-server #разрешения #изменить #sql-grant
Вопрос:
У меня есть роль базы данных с именем ApplicationUsers
. Я хочу предоставить участникам этой роли ALTER
разрешение для этой же роли, чтобы существующие участники могли добавлять или удалять других участников. Вот инструкция SQL, которую я пробовал:
GRANT ALTER ON [dbo].[ApplicationUsers] TO [ApplicationUsers]
Я получаю следующую ошибку:
Не удается найти объект ‘ApplicationUsers’, потому что он не существует или у вас нет разрешения.
Я могу подтвердить, что учетная запись пользователя, из GRANT
которой я выполняю команду, имеет, , требуемое разрешение. При запуске fn_my_permissions(NULL, 'DATABASE')
одно из возвращаемых значений равно ALTER ANY ROLE
.
Я дважды проверил, что роль существует и что она написана правильно. Вот фрагмент из SSMS:
Чего я не понимаю?
Редактировать:
Благодаря ответу Дэвида я получил команду для успешного выполнения, однако, похоже, на самом деле это не работает. Членам ApplicationUsers
группы, похоже, по-прежнему отказано в разрешении на добавление других участников. При просмотре свойств роли в SSMS разрешения отсутствуют:
Это после выполнения следующих команд:
GRANT ALTER ON ROLE::ApplicationUsers TO ApplicationUsers WITH GRANT OPTION
Комментарии:
1. Я бы предположил, что вы либо подключены к неправильной базе данных, либо
ROLE
не существует в базе данных, к которой вы подключены, если у вас определенно есть требуемые разрешения.2. Обратите внимание, если вам явно было отказано в доступе к изменению таблицы, то это также может повлиять на ваши разрешения на доступ к ней других пользователей.
3. @Larnu Я определенно подключен к нужной базе данных, и роль определенно существует. Я отредактировал вопрос, включив скриншот из SSMS, чтобы показать его. Я не верю, что у меня установлены какие-либо
DENY
разрешения (я тестирую это какdb_owner
).4. Прошу прощения, я неправильно прочитал. Я предполагал , что
[dbo].[ApplicationUsers]
это таблица / представление / etc с тем же именем, что и роль базы данных.
Ответ №1:
Необычно разрешать членам роли добавлять и удалять участников или переименовывать роль. Но вы можете сделать это следующим образом:
GRANT ALTER ON role::[ApplicationUsers] TO [ApplicationUsers]
Но похоже, что это не разрешено, и разрешение молча ничего не делает. Вместо этого введите роль ApplicationAdmins и предоставьте ей изменение в ApplictionUsers. например
create role ApplicationUsers
create role ApplicationAdmins
GRANT ALTER ON role::ApplicationUsers TO ApplicationAdmins
grant select to ApplicationUsers
select p.name grantee, perm.*
from sys.database_permissions perm
join sys.database_principals p
on perm.grantee_principal_id = p.principal_id
where class_desc = 'DATABASE_PRINCIPAL'
go
alter role ApplicationUsers add member ApplicationAdmins
alter role ApplicationAdmins add member user1
go
create table ApplicationTable(id int)
go
execute as user='user1'
alter role applicationusers add member user2
select * from ApplicationTable
revert
Комментарии:
1. Эта команда выполнена успешно, но некоторые, похоже, не сработали. Я обновил свой вопрос дополнительной информацией.