Не могу предоставить разрешение на изменение роли базы данных?

#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:

Изображение из SSMS

Чего я не понимаю?

Редактировать:

Благодаря ответу Дэвида я получил команду для успешного выполнения, однако, похоже, на самом деле это не работает. Членам ApplicationUsers группы, похоже, по-прежнему отказано в разрешении на добавление других участников. При просмотре свойств роли в SSMS разрешения отсутствуют:

Разрешения, отображаемые в 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. Эта команда выполнена успешно, но некоторые, похоже, не сработали. Я обновил свой вопрос дополнительной информацией.