我有以下设置:
有一个 SQL Server 数据库,其中有多个表,这些表上设置了触发器(收集历史数据)。这些触发器是带有 EXECUTE AS 'HistoryUser'
的 CLR 存储过程。 HistoryUser
用户是数据库中的简单用户,无需登录。它有足够的权限从所有表中读取数据并写入历史表。
当我备份数据库然后将其恢复到另一台计算机(在本例中为虚拟机,但这并不重要)时,触发器不再起作用。事实上,对用户的模仿已经不再有效。即使是这样简单的声明
exec ('select 3') as user='HistoryUser'
产生错误:
Cannot execute as the database principal because the principal "HistoryUser" does not exist, this type of principal cannot be impersonated, or you do not have permission.
我read in MSDN如果数据库所有者是域用户,则可能会发生这种情况,但事实并非如此。即使我将其更改为其他任何内容(他们推荐的解决方案),这个问题仍然存在。
如果我在没有登录的情况下创建另一个用户,我可以用它来模拟。也就是说,这工作得很好:
create user TestUser without login
go
exec ('select 3') as user='TestUser'
我不想重新创建所有这些触发器,那么有什么办法可以让现有的 HistoryUser
工作吗?
最佳答案
检测孤立用户,然后通过链接到登录来解决。
检测:
使用<数据库名称>;
去;
sp_change_users_login @Action='报告';
去;
解决:
以下命令将
使用<数据库名称>;
去
sp_change_users_login @Action='update_one',
@UserNamePattern='
@LoginName='<登录名>';
去
关于sql-server - SQL Server 错误 "EXECUTE AS",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/798206/