J'intègre SqlCacheDependency à utiliser dans mon contexte de données LinqToSQL.
J'utilise une classe d'extension pour les requêtes Linq trouvées ici - http://code.msdn.Microsoft.com/linqtosqlcache
J'ai câblé le code et lorsque j'ouvre la page, j'obtiens cette exception -
"Le courtier de service SQL Server pour la base de données actuelle n'est pas activé et, par conséquent, les notifications de requête ne sont pas prises en charge. Veuillez activer le courtier de service pour cette base de données si vous souhaitez utiliser les notifications."
sa venue de cet événement dans le global.asax
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
//In Application Start Event
System.Data.SqlClient.SqlDependency.Start(new dataContextDataContext().Connection.ConnectionString);
}
ma question est...
comment activer Service Broker dans ma base de données SQL Server 2008? J'ai essayé d'exécuter cette requête .. ALTER DATABASE tablename SET ENABLE_BROKER mais elle ne se termine jamais et s'exécute pour toujours, je dois l'arrêter manuellement.
une fois que j'aurai cet ensemble dans SQL Server 2008, filtrera-t-il vers mon DataContext, ou dois-je configurer quelque chose là aussi?
merci pour toute aide
Truegilly
ok voici comment faire si la vôtre est désactivée ou si vous devez restaurer une sauvegarde, ce qui semble la désactiver.
il suffit d'exécuter ce script, il tuera tous les processus utilisés par une base de données (pourquoi vous avez tué manuellement en 2008 les processus contrairement à 2005 me dépasse), puis définissez le courtier
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
Au cas où quelqu'un d'autre chercherait une solution à ce problème, la commande suivante a très bien fonctionné pour moi. Il libère toutes les autres connexions à la base de données au lieu d'attendre.
ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
Dans Sql Server 2012, vous pouvez accéder à Properties-> Options -> Service Broker
Toutes les connexions à la base de données doivent être supprimées et un compte utilisateur avec des autorisations doit être utilisé pour activer le service de courtier.
L'idéal serait de remplacer (remplacer 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;
Je suggère également de créer un nouveau rôle et un nouveau compte utilisateur avec les autorisations appropriées (remplacer la connexion à la base de données):
--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';