我正在尝试使用 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 可能在从队列中读取消息之前已经断开连接)。