9

我有以下设置:

有一个 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

4 回答 4

5

触发器作为什么用户帐户执行。

您需要为用户帐户 HistoryUser 授予该用户 IMPERSONATE 特权。

 GRANT IMPERSONATE ON USER:: YourUser TO HistoryUser

更多细节在这里

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

于 2009-04-28T14:44:48.733 回答
5

检测孤立用户,然后通过链接到登录来解决。

检测:

使用<数据库名称>;
去;
sp_change_users_login @Action='报告';
去;

RESOLVE:
以下命令将 <login_name> 指定的服务器登录帐户与 <database_user> 指定的数据库用户重新链接:

USE <database_name>;

sp_change_users_login @Action='update_one',
@UserNamePattern='<database_user>',
@LoginName='<login_name>';

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

于 2015-04-01T10:55:06.543 回答
4

将数据库从一台机器移动到另一台机器后出现的此类问题通常涉及不匹配的 SID,尽管我不确定它是否或如何适用于您的情况。尝试删除并重新创建数据库用户,确保恢复其对这些表的权限。

于 2009-04-28T22:24:08.253 回答
1

它是一个“孤立用户”。它不会工作。文档清楚地说明了这一点。:-( 修复“孤立用户”状态,它将再次工作

于 2010-01-31T17:09:22.880 回答