SqlQueryNotificationStoredProcedure的错误填满了Sql Server日志

cbp*_*cbp 17 sql-server notifications

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

在队列'MyDatabase.dbo.SqlQueryNotificationService-b65a194e-e29f-4ba0-8f5a-79f0875bd609'上运行的激活的proc'[dbo].[SqlQueryNotificationStoredProcedure-b65a194e-e29f-4ba0-8f5a-79f0875bd609]'输出以下内容:'无法执行数据库主体因为主体"dbo"不存在,这种类型的主体不能被模拟,或者你没有权限.

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

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

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

select * from sys.service_queues
Run Code Online (Sandbox Code Playgroud)

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

但是,如果我尝试使用以下命令杀死这些...

drop queue [SqlQueryNotificationService-78f5b757-45f0-4a4d-83f5-91e1d7e46294]
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*anu 25

无法作为数据库主体执行,因为主体"dbo"不存在,此类主体不能被模拟,或者您没有权限.

您必须先解决此问题:

ALTER AUTHORIZATION ON DATABASE::<dbname> TO [sa];
Run Code Online (Sandbox Code Playgroud)

现在,如果你想知道会发生什么,我会在我的博客上推荐一些文章:神秘的通知下雨的时候,它倒了.在你的情况下,问题是两个折叠:

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

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

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


cbp*_*cbp 5

我通过删除底层服务来阻止错误日志填满:

select * from sys.services

-- do this for every service:
drop service [SqlQueryNotificationService-7d871b6d-3868-452c-b75b-d5c5b13d0301]
Run Code Online (Sandbox Code Playgroud)

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

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