1

我正在尝试使用 Service Broker 在我的 SQL Server 上配置审核。我完成了捕获 DDL 事件(队列、路由、端点、事件通知)所需的所有配置。它工作正常,只是我无法从 DDL 事件的来源处获取客户端的主机名。

使用服务代理的激活过程,我尝试从 message_body 读取值,但没有包含主机名的 xml 元素。我可以看到 SPID 的值,但无法使用它。执行 sp_who 并针对此 SPID 查询 sys.processes 不会返回任何值。并且运行不带参数的 sp_who 只显示一个进程(我认为它是服务代理使用的后台进程)。是不是因为消息是异步发送的?但是为什么会导致激活上下文在 sys.processes 视图上看到不同的数据呢?

我知道有 DDL 触发器可以实现相同的目标,但它似乎与导致它触发的命令紧密耦合。因此,如果触发器失败,命令也会失败。

更新:我设法通过使用 xp_cmdshell 和 sqlcmd (命令行应用程序)的组合来检索主机名。但我也意识到,由于消息是异步的,它并不总是可靠的(发出 DDL 命令的 SPID 可能在从队列中读取消息之前已经断开连接)。

4

1 回答 1

0

我不确定您要在这里实现什么,但预计激活的过程只会看到 DMV 中的一部分行。这与激活上下文有关,激活上下文通常会模拟您在调试过程时使用的不同用户。该模拟用户将只能看到它有权访问的这些服务器级视图和 DMV 行。有关更多信息,请参见此处此处

于 2010-03-17T17:44:14.167 回答