Ошибки с SqlQueryNotificationStoredProcedure заполнили журнал SQL-сервера

Мои журналы 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' не может быть отброшена, потому что она связывается с одним или несколькими, обслуживают.

17
задан cbp 10 February 2010 в 02:02
поделиться

2 ответа

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

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

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

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

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

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

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

25
ответ дан 30 November 2019 в 12:00
поделиться

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

select * from sys.services

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

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

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

5
ответ дан 30 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: