2010-02-10 9 views
15

Mis registros de SQL Server se están llenando a un ritmo rápido con mensajes de error como el siguiente:.de errores con SqlQueryNotificationStoredProcedure llenaron registros de SQL Server

El proc activado '[dbo] [SqlQueryNotificationStoredProcedure-b65a194e-e29f -4ba0-8f5a-79f0875bd609] ' que se ejecuta en la cola 'MyDatabase.dbo.SqlQueryNotificationService-b65a194e-e29f-4ba0-8f5a-79f0875bd609' de salida lo siguiente:' no se puede ejecutar como el principal base de datos porque la principal "dbo" hace no existe, este tipo de principal no puede ser suplantado, o usted no tiene el permiso . '

Ninguno de los procedimientos almacenados a los que se hace referencia en estos mensajes existe más.

El problema es similar al descrito here. El artículo menciona que el problema debería haberse solucionado en 2008 SP1 pero ya estoy ejecutando SP1.

Si funciono el siguiente comando ...

select * from sys.service_queues 

... noto que hay una gran cantidad de elementos en cola como SqlQueryNotificationService-f944d750-8530-4762-ADCF-6948e8da991f.

Pero si trato y matar a estos con el siguiente comando ...

drop queue [SqlQueryNotificationService-78f5b757-45f0-4a4d-83f5-91e1d7e46294] 

... Recibo un mensaje de error: La cola 'SqlQueryNotificationService-78f5b757-45f0-4a4d-83f5-91e1d7e46294' no se puede descartar porque está vinculado a uno o más servicios.

Respuesta

24

no puede ejecutar como la base de datos principal de debido a que el director de "dbo" no existe, este tipo de principal no se puede suplantar, o no hacerlo tienen permiso.

Debe corregir este problema en primer lugar:

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

Ahora bien, si usted quiere saber lo que pasa, te recomiendo algunos artículos en mi blog: The Mysterious Notification y When it rains, it pours. En su caso, el problema es dos plegados:

  • un error administrativo que dio como resultado una base de datos con un dbo huérfano. Esto es generalmente el resultado de una conexión/restauración de la base de datos creada por un SID de Windows desde una autoridad no relacionada (es decir, una cuenta local en una computadora diferente).
  • error de codificación en el uso de SqlDependency en que el código omite llamar a Stop() cuando está hecho, por lo que no se puede destruir la infraestructura temporal SqlDependency.

Normalmente el procedimiento activado de la infraestructura temporal SqlDependency sería eliminar la cola de temporal/servicio/procedimientos, pero en su caso el hecho de que la activación no se puede ejecutar debido a la DBO huérfanos arruina todo.

Una vez que arregle el dbo huérfano (al ejecutar ALTER al inicio de mi publicación) se podrán ejecutar los procedimientos activados y se limpiarán todas las colas, servicios y procedimientos temporales.

+0

+1 Esto es exactamente lo que necesitaba! –

5

que se detuvo el registro de errores se llene al dejar caer el servicio subyacente:

select * from sys.services 

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

Entonces podría volver atrás y eliminar todas las colas.

Ahora la pregunta es cómo evitar que esto ocurra en el futuro.

2

Tuve un problema similar en SQL 2008 R2. Una vez que se corrigió el asunto del propietario de la base de datos, seguí viendo mensajes similares en el registro, pero básicamente establecieron que el SqlQueryNotificationService no pudo ubicarse.

La solución final fue a caer y volver a crear el corredor, como se indica aquí: 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

de Salto a 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 
Cuestiones relacionadas