SqlQueryNotificationStoredProcedure的错误填满了Sql Server日志

时间:2010-02-10 02:02:07

标签: sql-server notifications

我的Sql Server日志正在迅速填写,并显示如下错误消息:

  

激活的过程   '[DBO] [SqlQueryNotificationStoredProcedure-b65a194e-e29f-4ba0-8f5a-79f0875bd609]'   在队列上运行   'MyDatabase.dbo.SqlQueryNotificationService-b65a194e-e29f-4ba0-8f5a-79f0875bd609'输出以下内容:'无法执行   作为数据库主体因为   这个主要的“dbo”不存在   主体的类型不能   冒充,或者你没有   权限'。

这些消息引用的存储过程都不存在。

问题类似于here所描述的问题。文章提到该问题应该已在2008 SP1中修复,但我已经在运行SP1。

如果我运行以下命令......

select * from sys.service_queues

...我注意到有很多排队的项目,例如 SqlQueryNotificationService-f944d750-8530-4762-adcf-6948e8da991f

但是如果我尝试使用以下命令杀死它们......

drop queue [SqlQueryNotificationService-78f5b757-45f0-4a4d-83f5-91e1d7e46294]

...我收到一条错误消息:队列'SqlQueryNotificationService-78f5b757-45f0-4a4d-83f5-91e1d7e46294'无法删除,因为它绑定了一个或多个服务。

4 个答案:

答案 0 :(得分:24)

  

无法作为数据库执行   校长,因为校长“dbo”   不存在,这种类型的委托人   不能被冒充,或者你没有   得到许可。

您必须先解决此问题:

ALTER AUTHORIZATION ON DATABASE::<dbname> TO [sa];

现在,如果你想知道会发生什么,我建议在我的博客上发表一些文章:The Mysterious NotificationWhen it rains, it pours。在你的情况下,问题是两个折叠:

  • 导致带有孤立dbo的数据库的管理错误。这通常是由不相关的权限(即不同计算机上的本地帐户)的Windows SID创建的数据库附加/恢复的结果。
  • 使用SqlDependency时出现编码错误,因为代码在完成时省略了调用Stop(),因此无法拆除SqlDependency临时基础结构。

通常,SqlDependency临时基础结构的激活过程会删除临时队列/服务/过程,但在您的情况下,由于孤立的dbo而无法运行激活的事实。

一旦你修复了孤立的dbo(通过在我的帖子开始时运行ALTER),激活的程序将能够运行并且它们将清除所有临时队列,服务和程序。

答案 1 :(得分:5)

我通过删除基础服务来阻止错误日志填写:

select * from sys.services

-- do this for every service:
drop service [SqlQueryNotificationService-7d871b6d-3868-452c-b75b-d5c5b13d0301]

然后我可以回去删除所有队列。

现在的问题是如何防止将来发生这种情况。

答案 2 :(得分:3)

我在SQL 2008 R2上遇到了类似的问题。一旦数据库所有者的事情得到纠正,我继续在日志中看到类似的消息,但他们基本上声明SqlQueryNotificationService无法找到自己。

最终解决方案是删除并重新创建代理,如下所示: http://www.neolisk.com/techblog/MS-SQL-Server-2008-R2-Error-Log-Growing-Rapidly

ALTER DATABASE <DBNAME> SET DISABLE_BROKER
ALTER DATABASE <DBNAME> SET NEW_BROKER
ALTER DATABASE <DBNAME> SET ENABLE_BROKER

答案 3 :(得分:2)

仅删除SqlQueryNotificationStoredProcedure SP:

use <your DB name>;
declare @procName varchar(500)
declare cur cursor 

for select [name] from sys.objects WHERE type in (N'P', N'PC') and name like 'SqlQueryNotificationStoredProcedure%'
open cur
fetch next from cur into @procName
while @@fetch_status = 0
begin
exec ('drop procedure [' + @procName+']')
fetch next from cur into @procName
end
close cur
deallocate cur