【问题标题】:Get hostname when reading Service Broker Queue (SQL Server 2005)读取 Service Broker 队列时获取主机名 (SQL Server 2005)
【发布时间】:2010-03-17 12:31:19
【问题描述】:

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

【问题讨论】:

  • 在阅读我的问题后,我意识到事件通知消息可能来自另一个 sql 服务器,因此如果我要使用 SPID 来解析主机名,我必须使用该(另一个)服务器来解析它。

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


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。我想要实现的是使用事件通知和服务代理来捕获 DDL 事件。不幸的是,发送到服务代理的 DDL 事件通知消息不包含有关 DDL 命令源自的主机名的信息,仅包含 SPID。当我的 SP 被消息队列激活时,我可以通过将其内容转储到某个表来检查 DMV,而不是通过在调试器或 SSMS 上运行它。
  • 你不能使用 EVENTDATA 的 元素吗?
  • 但是 ServerName 是运行 DDL 命令的数据库服务器的名称。我对实际发出命令的客户端的主机名感兴趣。
  • 哦,我明白了。对不起,我在你原来的问题中错过了。正如您正确指出的那样,尝试从异步激活过程中解析 spid 永远不会可靠,因为无法保证客户端连接在解析 spid 时仍然存在。如果这是您的要求,那么我认为您应该考虑使用触发器或分析器审计跟踪,而不是固有的异步服务代理。或者只是使用 Service Broker 从触发器发送自定义的“事件通知”(包含客户端的主机名)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多