代码之家  ›  专栏  ›  技术社区  ›  cbp

SqlQueryNotificationsStoredProcedure的错误已填充SQL Server日志

  •  16
  • cbp  · 技术社区  · 15 年前

    我的SQL Server日志正在以很快的速度填充错误消息,如下所示:

    激活的进程 '[dbo].[sqlquerynotificationstoredprocedure-b65a194e-e29f-4ba0-8f5a-79f0875bd609]' 在队列上运行 'mydatabase.dbo.sqlquerynotificationservice-b65a194e-e29f-4ba0-8f5a-79f0875bd609'输出以下内容:'无法执行 作为数据库主体,因为 主体“dbo”不存在,此 主体类型不能为 冒充,或者你没有 允许。”

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

    问题与所描述的类似 here . 这篇文章提到这个问题应该在2008SP1中修复,但是我已经在运行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 回复  |  直到 7 年前
        1
  •  24
  •   Kevin Kalitowski    7 年前

    无法作为数据库执行 因为主体“dbo” 不存在,此类型的主体 不能被冒充,或者你没有 得到许可。

    必须先解决此问题:

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

    现在如果你想知道发生了什么,我在我的博客上推荐一些文章: The Mysterious Notification When it rains, it pours . 在您的情况下,问题是两个折叠:

    • 一个管理错误,导致数据库中有一个孤立的dbo。这通常是由Windows SID从不相关的机构(即不同计算机上的本地帐户)创建的数据库附加/还原的结果。
    • 在使用sqldependency时的一个编码错误,因为代码在完成时忽略了调用stop(),因此未能拆除sqldependency临时基础结构。

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

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

        2
  •  5
  •   cbp    15 年前

    我通过删除基础服务阻止了错误日志的填充:

    select * from sys.services
    
    -- do this for every service:
    drop service [SqlQueryNotificationService-7d871b6d-3868-452c-b75b-d5c5b13d0301]
    

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

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

        3
  •  3
  •   Goner Doug    12 年前

    我在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
    
        4
  •  2
  •   Igor Gorjanc    12 年前

    仅删除SqlQueryNotificationsStoredProcedure 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