sql-server - SQL Server 错误 "EXECUTE AS"

标签 sql-server impersonation

我有以下设置:

有一个 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='<登录名>';

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

关于sql-server - SQL Server 错误 "EXECUTE AS",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/798206/

相关文章:

php - 数据库连接 "Sqlserver"丢失或无法创建

SQL选择第一列来匹配单行中许多列的条件

c# - Windows 身份模拟未持久保存到 Sql 可信连接中

asp.net - 模拟 ASP.NET 将身份声明为 Windows 身份

c# - 单击按钮后如何在数据网格中选中复选框的情况下传输数据? C# 和 SQL Server

c# - C# long 类型的等效 SQL Server 类型是什么?

c# - 如何设置 ASP.NET 安全模拟

c# - WCF 模拟不是模拟管理员

sql - 存储过程 - 功能性能差异

c# - 模拟用户