读取Service Broker队列时获取主机名(SQL Server 2005)

时间:2010-03-17 12:31:20

标签: sql-server sql-server-2005 service-broker

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

1 个答案:

答案 0 :(得分:0)

我不确定你在这里尝试实现什么,但是预计激活的过程只能看到DMV中的行子集。这与激活上下文有关,激活上下文通常会模拟您在调试过程时使用的其他用户。该模拟用户只能看到它拥有权限的服务器级视图和DMV行。有关详细信息,请参阅herehere