Мои журналы SQL-сервера заполняются при высокой скорости сообщениями об ошибках как следующее:
Активированный proc' [dbo]. [SqlQueryNotificationStoredProcedure-b65a194e-e29f-4ba0-8f5a-79f0875bd609]', работающий на очереди 'MyDatabase.dbo. SqlQueryNotificationService-b65a194e-e29f-4ba0-8f5a-79f0875bd609' производят следующее: 'Не может выполниться как принципал базы данных, потому что принципал "dbo" не существует, этот тип принципала не может быть явлен олицетворением, или у Вас нет разрешения'.
Ни одна из хранимых процедур, на которые ссылаются эти сообщения, больше не существует.
Проблема подобна описанному здесь. Статья упоминает, что проблема должна была быть устранена в 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' не может быть отброшена, потому что она связывается с одним или несколькими, обслуживают.
Невозможно выполнить в качестве принципала базы данных, поскольку принципал "dbo" не существует, этот тип принципала не может быть выдал себя за другое лицо, или у вас нет разрешения.
Сначала вы должны решить эту проблему:
ALTER AUTHORIZATION ON DATABASE::<dbname> TO [sa];
Теперь, если вы хотите знать, что происходит, я рекомендую несколько статей в моем блоге: Таинственное уведомление и Когда идет дождь, он льет . В вашем случае проблема состоит из двух частей:
Обычно активированная процедура временной инфраструктуры SqlDependency удаляет временную очередь / службу / процедуры, но в вашем случае тот факт, что активация не может быть запущена из-за потерянного dbo, все разрушает.
Как только вы исправите потерянную dbo (запустив ALTER в начале моего сообщения), активированные процедуры смогут запускаться, и они очистят все временные очереди, службы и процедуры.
Я остановил заполнение журнала ошибок, отбросив базовую службу:
select * from sys.services
-- do this for every service:
drop service [SqlQueryNotificationService-7d871b6d-3868-452c-b75b-d5c5b13d0301]
Затем я мог вернуться и удалить все очереди.
Теперь вопрос в том, как предотвратить это в будущем.