2

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

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

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

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

目前我们收到此错误消息

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

我们试过了WITH EXECUTE AS 'UserB',没有运气。

4

1 回答 1

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 存储过程的权限。

于 2010-10-01T18:58:40.383 回答