Ошибка с SQL Server «EXECUTE AS» - PullRequest
       18

Ошибка с SQL Server «EXECUTE AS»

8 голосов
/ 28 апреля 2009

У меня есть следующие настройки:

Существует БД SQL Server с несколькими таблицами, на которых установлены триггеры (которые собирают данные истории). Эти триггеры являются хранимыми процедурами CLR с EXECUTE AS 'HistoryUser'. Пользователь HistoryUser - это простой пользователь в базе данных без логина. У него достаточно прав для чтения из всех таблиц и записи в таблицу истории.

Когда я делаю резервную копию БД и затем восстанавливаю ее на другой машине (в данном случае это виртуальная машина, но это не имеет значения), триггеры больше не работают. Фактически, никакая персонализация для пользователя больше не работает. Даже простое утверждение, подобное этому

exec ('select 3') as user='HistoryUser'

выдает ошибку:

Невозможно выполнить роль участника базы данных, так как участник "HistoryUser" не существует, этот тип участника не может быть олицетворен или у вас нет разрешения.

Я прочитал в MSDN , что это может произойти, если владельцем БД является пользователь домена, но это не так. И даже если я изменю это на что-то другое (их рекомендуемое решение), эта проблема останется.

Если я создаю другого пользователя без логина, я могу использовать его для олицетворения просто отлично. То есть это работает просто отлично:

create user TestUser without login
go
exec ('select 3') as user='TestUser'

Я не хочу воссоздавать все эти триггеры, так есть ли способ заставить работать существующий HistoryUser?

Ответы [ 4 ]

5 голосов
/ 01 апреля 2015

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

DETECT:

USE ;
ИДТИ;
sp_change_users_login @ Action = 'Отчет';
ИДТИ;

постановляю:
Следующая команда связывает учетную запись входа на сервер, указанную в , с пользователем базы данных, указанным в :

USE ;
GO
sp_change_users_login @ Action = 'update_one',
@UserNamePattern = '',
@Loginname = '';
GO

https://msdn.microsoft.com/en-us/library/ms175475.aspx

4 голосов
/ 29 апреля 2009

Подобные проблемы, возникающие после перемещения базы данных с одного компьютера на другой, обычно связаны с несовпадающими SID, хотя я не уверен, применимо ли это к вашему случаю. Попробуйте удалить и заново создать пользователя базы данных, убедившись, что восстановили его разрешения для этих таблиц.

4 голосов
/ 28 апреля 2009

Какую учетную запись пользователя выполняет триггер.

Вам необходимо предоставить привилегии IMPERSONATE этому пользователю для User History History.

 GRANT IMPERSONATE ON USER:: YourUser TO HistoryUser

Подробнее здесь

http://msdn.microsoft.com/en-us/library/ms181362.aspx

2 голосов
/ 31 января 2010

Это «осиротевший пользователь». Это не сработает. Документация утверждает это ясно. :-( Исправьте состояние «осиротевший пользователь», и оно снова будет работать

...