【问题标题】:Running trigger that calls stored procedure on another database运行在另一个数据库上调用存储过程的触发器
【发布时间】:2011-04-19 18:23:17
【问题描述】:

我们希望在一个数据库 (A) 上运行一个触发器,该触发器调用另一个数据库 (B) 上的存储过程。

在 TableA 上创建触发器 trg_A 插入 作为 开始 执行数据库B.dbo.stp_B 结束

我们希望在 DatabaseA 上使用 LoginA 和 UserA 来执行此操作。我们在 DatabaseB 上也有带有 UserB 的 LoginB。

我们怎样才能做到这一点?

目前我们收到此错误消息

服务器主体“...”无法访问
当前安全上下文下的数据库“DatabaseB”。

我们尝试了WITH EXECUTE AS 'UserB',但没有成功。

【问题讨论】:

  • 请用您正在使用的数据库产品标记它。
  • 任何你不能在 DatabaseB 上授予 LoginA 权限的原因 - 仅限于那个

标签: sql sql-server sql-server-2008 triggers cross-database


【解决方案1】:

有趣的问题。你书呆子狙击了我。我测试了一堆不同的场景。

这些失败:

  1. tableA 上的触发器引用了 DatabaseB 中的存储过程。 LoginA 在 DatabaseB 中不作为用户存在。
  2. tableA 上的触发器引用 DatabaseA 中插入 DatabaseB.dbo.TableB 的存储过程。数据库 B 中不存在 LoginA。
  3. 在 DatabaseB 上将 LoginA 创建为用户,但没有赋予它任何权限。重复 test1 和 test2。两者都失败了。
  4. 在 DatabaseA 上将 LoginB 创建为用户。确保 LoginB 可以插入到 DatabaseB.dbo.TableB。以 LoginA 身份登录到 DatabaseA,运行 EXECUTE AS User = 'LoginB'。尝试插入 DatabaseA.dbo.TableA。

我可以让触发器工作的唯一方法是在 DatabaseB 中为 LoginA 创建一个用户并授予执行 DatabaseB 存储过程的权限。

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多