【问题标题】:Stored procedure fails when called from Service Broker but runs from SSMS从 Service Broker 调用但从 SSMS 运行时存储过程失败
【发布时间】:2014-07-29 14:42:22
【问题描述】:

我们在 SQL Server 2008R2 中使用 Service Broker 作为简单的作业调度程序。我们向代理发送一条消息,它会将其设置为在请求的日期/时间进行处理。

我们有一个由用户在 Sharepoint 站点中的操作自动安排的作业(存储过程),并且它已经运行了大约一年。如果它们不存在,此存储过程将创建 2 个表,如果它们存在则截断它们,然后调用 2 个其他存储过程(串联)来填充每个表。

几周前,当主过程“作业”由 SB 启动时,两个存储过程中的第二个开始失败。如果我进入 SSMS,我可以执行“作业”存储过程并且它运行完成没有问题(即两个调用的存储过程都执行没有问题,并且两个表都已填充)。

我们公司以其无限的智慧决定终止建立 Service Broker 并编写这些存储过程的人。我了解存储过程,并且开始对 SB 有所了解,但我不知道为什么第二个存储过程将从 SSMS 执行,但在从 Service Broker 调用时失败。

我唯一能想到的是服务是用这个命令创建的:

CREATE SERVICE [//ScheduledJobService]
AUTHORIZATION [user ID]
ON QUEUE [dbo].[ScheduledJobQueue] ([//ScheduledJobContract])

并且他的身份证在停止工作之日发生了一些事情。但是,这并不能解释为什么部分代码会执行,以及 Service Broker 中的其他任务如何继续执行。

我不知道在哪里寻找以及如何追踪它,因此非常感谢任何故障排除提示。

【问题讨论】:

标签: sql sql-server-2008-r2 service-broker


【解决方案1】:

Service Broker 作为后台进程,需要以特定用户的身份运行事物。在我的代理安装中,我通常为此创建了一个特殊用户(即Broker_User),该用户有权执行它需要执行的任何内容,而没有其他权限。

如果该服务或代理队列激活过程的授权帐户被撤销,事情就会失败。

要真正追踪这一点,我们需要知道:

  • 队列的详细信息(创建语句等)
  • 上述激活过程的详细信息
  • 有关帐户的信息

其中一个 SP 中也可能存在使用 EXECUTE AS 的代码,如果帐户被删除或撤销,则会导致问题。

【讨论】:

  • CREATE QUEUE [dbo].[ScheduledJobQueue] WITH STATUS = ON , RETENTION = OFF , ACTIVATION ( STATUS = ON , PROCEDURE_NAME = [dbo].[SCHED_RunJob] , MAX_QUEUE_READERS = 20 , EXECUTE AS N'<manager account>' ), POISON_MESSAGE_HANDLING (STATUS = ON) ON [PRIMARY] 的经理也已不在公司。我完全理解我们在账户被禁用/删除的风险下运行,但是,Broker 仍在继续运行。进一步的 cmets 中的更多详细信息(如果这不是正确的方法以及是什么,请告诉我)。
  • CREATE CONTRACT [//ScheduledJobContract] AUTHORIZATION [<manager account>] ([http://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer] SENT BY INITIATOR) 这和我们一样,不再是用于创建队列的经理帐户。
  • 这个帐户是 SQL 登录吗?该帐户可能仍然存在,但不再具有任何权限。
  • 我们确实在 Broker 中使用了其他任务,它们都运行良好。我搜索了主过程调用的所有各种存储过程(在失败的部分),没有Execute as语句
  • 是的,这是一个与他的网络登录相关联的 SQL 登录。我完全同意您的观点,即失去帐户 的权利将导致事情失败。让我感到困惑的是,这个 SP 的 一些 是如何工作的,而其他部分是如何失败的,以及其他 SP 是如何毫无问题地执行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多