notification asp.net linq caching datacontext sqlcachedependency

asp.net - signalr sql server notification



HabilitaciĆ³n de Service Broker en SQL Server 2008 (4)

Estoy integrando SqlCacheDependency para usar en mi contexto de datos LinqToSQL.

Estoy usando una clase de extensión para las consultas de Linq que se encuentran aquí - http://code.msdn.microsoft.com/linqtosqlcache

He cableado el código y cuando abro la página obtengo esta excepción:

"SQL Server Service Broker para la base de datos actual no está habilitado, y como resultado las notificaciones de consulta no son compatibles. Habilite Service Broker para esta base de datos si desea usar notificaciones".

viene de este evento en el global.asax

protected void Application_Start() { RegisterRoutes(RouteTable.Routes); //In Application Start Event System.Data.SqlClient.SqlDependency.Start(new dataContextDataContext().Connection.ConnectionString); }

mi pregunta es...

  1. ¿Cómo habilito Service Broker en mi base de datos de SQL Server 2008? He intentado ejecutar esta consulta .. ALTER DATABASE tablename SET ENABLE_BROKER pero nunca termina y se ejecuta para siempre, tengo que detenerlo manualmente.

  2. una vez que tenga este conjunto en SQL Server 2008, ¿se filtrará a mi DataContext, o debo configurar algo allí también?

Gracias por cualquier ayuda

Truegilly


Deben eliminarse todas las conexiones a la base de datos y la cuenta de usuario con los permisos utilizados para habilitar el servicio de intermediario.

Lo siguiente sería ideal (replace databasename ):

IF ((SELECT is_broker_enabled FROM sys.databases WHERE name = ''%DATABASE_NAME%'') = 1) BEGIN ALTER DATABASE %DATABASE_NAME% SET NEW_BROKER WITH ROLLBACK IMMEDIATE; END ALTER DATABASE %DATABASE_NAME% SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;

También sugiero crear una nueva función y una cuenta de usuario con los permisos adecuados (reemplazar el inicio de sesión de la base de datos):

--DBA creates a new role if not exists (select 1 from sys.database_principals where name=''sql_dependency_subscriber'' and Type = ''R'') begin EXEC sp_addrole ''sql_dependency_subscriber'' end --Minimum Required Permissions needed for SQLDependancy Notification to work GRANT CREATE PROCEDURE to sql_dependency_subscriber; GRANT CREATE QUEUE to sql_dependency_subscriber; GRANT CREATE SERVICE to sql_dependency_subscriber; GRANT REFERENCES on CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] to sql_dependency_subscriber ; GRANT VIEW DEFINITION TO sql_dependency_subscriber; --Minimum Required Permissions needed for SQLDependaney Notification to work GRANT SELECT to sql_dependency_subscriber; GRANT SUBSCRIBE QUERY NOTIFICATIONS TO sql_dependency_subscriber; GRANT RECEIVE ON QueryNotificationErrorsQueue TO sql_dependency_subscriber; GRANT REFERENCES on CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] to sql_dependency_subscriber ; EXEC sp_addrolemember ''sql_dependency_subscriber'', ''%DATABASE_LOGIN%''; EXEC sp_addrolemember ''sql_dependency_subscriber'', ''sqldp'';


En Sql Server 2012 puede ir a Properties-> Options -> Service Broker


En caso de que alguien más esté buscando una solución a este problema, el siguiente comando funcionó muy bien para mí. Lanza todas las demás conexiones a la base de datos en lugar de esperar.

ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE


ok aquí es cómo hacer esto si el tuyo está deshabilitado o si necesitas restaurar una copia de seguridad, que parece deshabilitarla.

simplemente ejecute este script, matará todos los procesos que está usando una base de datos (por qué usted implicó el proceso de eliminación manual en 2008 a diferencia de 2005) y luego configuró el intermediario

USE master go DECLARE @dbname sysname SET @dbname = ''YourDBName'' DECLARE @spid int SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) WHILE @spid IS NOT NULL BEGIN EXECUTE (''KILL '' + @spid) SELECT @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) AND spid > @spid END ALTER DATABASE @dbname SET ENABLE_BROKER