我正在尝试使用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可能已经断开连接。)