我有以下设置:
有一个 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
工作?