Ошибки с SqlQueryNotificationStoredProcedure заполнили журнал Sql Server - PullRequest
16 голосов
/ 10 февраля 2010

Журналы моего Sql Server быстро заполняются сообщениями об ошибках, такими как:

Активированный процесс '[DBO]. [SqlQueryNotificationStoredProcedure-b65a194e-e29f-4ba0-8f5a-79f0875bd609] работает в очереди «MyDatabase.dbo.SqlQueryNotificationService-b65a194e-e29f-4ba0-8f5a-79f0875bd609» выдает следующее: «Невозможно выполнить в качестве принципала базы данных, потому что главная "дбо" не существует, это тип принципала не может быть выдавал себя за вас, или у вас нет разрешение.

Ни одна из хранимых процедур, на которые ссылаются эти сообщения, больше не существует.

Проблема аналогична описанной здесь . В статье упоминается, что проблема должна быть исправлена ​​в пакете обновления 1 (SP1) 2008 года, но я уже использую пакет обновления 1 (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 ]

24 голосов
/ 10 февраля 2010

Невозможно выполнить как базу данных основной, потому что основной "дбо" не существует, этот тип принципала не может быть подражать, или вы не есть разрешение.

Вы должны сначала решить эту проблему:

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

Теперь, если вы хотите узнать, что происходит, я рекомендую несколько статей в моем блоге: Таинственное уведомление и Когда идет дождь, льет . В вашем случае проблема складывается в два раза:

  • административная ошибка, которая привела к созданию базы данных с осиротевшим dbo. Обычно это является результатом подключения / восстановления базы данных, созданной SID Windows из несвязанного органа (т. Е. Локальной учетной записи на другом компьютере).
  • ошибка кодирования при использовании SqlDependency в том, что в коде пропускается вызов Stop (), когда это делается, что не позволяет разрушить временную инфраструктуру SqlDependency.

Обычно активированная процедура временной инфраструктуры SqlDependency удаляет временную очередь / службу / процедуры, но в вашем случае тот факт, что активация не может быть запущена из-за потерянного dbo, разрушает все.

Как только вы исправите осиротевшую базу данных (запустив ALTER в начале моего поста), активированные процедуры смогут запускаться и будут очищать все временные очереди, службы и процедуры.

5 голосов
/ 10 февраля 2010

Я остановил заполнение журнала ошибок, удалив базовый сервис:

select * from sys.services

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

Тогда я могу вернуться и удалить все очереди.

Теперь вопрос заключается в том, как предотвратить это в будущем.

3 голосов
/ 06 сентября 2012

У меня была похожая проблема в 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
2 голосов
/ 30 мая 2013

Удалить только 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
...