【问题标题】:Error with SQL Server "EXECUTE AS"SQL Server“EXECUTE AS”错误
【发布时间】:2010-10-22 08:14:18
【问题描述】:

我有以下设置:

有一个 SQL Server 数据库,其中包含多个表,这些表上设置了触发器(用于收集历史数据)。这些触发器是带有EXECUTE AS 'HistoryUser' 的CLR 存储过程。 HistoryUser 用户是数据库中的简单用户,无需登录。它有足够的权限读取所有表并写入历史表。

当我备份数据库然后将其恢复到另一台机器(在这种情况下是虚拟机,但没关系)时,触发器不再起作用。事实上,不再模拟用户。即使是这样的简单语句

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

产生错误:

无法作为数据库主体执行,因为主体“HistoryUser”不存在,无法模拟此类主体,或者您没有权限。

read in MSDN 如果数据库所有者是域用户,则可能会发生这种情况,但事实并非如此。即使我将其更改为其他任何内容(他们推荐的解决方案),这个问题仍然存在。

如果我创建另一个没有登录的用户,我可以用它来模拟就好了。也就是说,这很好用:

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

我不想重新创建所有这些触发器,那么有什么方法可以让现有的HistoryUser 工作吗?

【问题讨论】:

    标签: sql-server impersonation


    【解决方案1】:

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

    检测:

    使用 ;
    走;
    sp_change_users_login @Action='报告';
    走;

    解决:
    以下命令将 指定的服务器登录帐户与 指定的数据库用户重新链接:

    使用 ;

    sp_change_users_login @Action='update_one',
    @UserNamePattern='',
    @LoginName='';
    去吧

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 哪些文档 - 您可以提供链接吗?谢谢
      【解决方案3】:

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

      【讨论】:

      • 这就是重点 - 该用户从未登录过。什么 SID?而且,正如我在上面的问题中所说,我宁愿不重新创建用户,因为那样我还必须重新创建一大堆触发器。
      • 这对我有用。我们不得不从另一台服务器迁移数据库并遇到了这个问题。
      【解决方案4】:

      触发器以什么用户帐户执行。

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

       GRANT IMPERSONATE ON USER:: YourUser TO HistoryUser
      

      这里有更多细节

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

      【讨论】:

        猜你喜欢
        • 2013-06-28
        • 2020-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-26
        相关资源
        最近更新 更多