2010-05-03 14 views
38

Integruję SqlCacheDependency do użycia w moim datacontext LinqToSQL.Włączanie brokera usług w SQL Server 2008

Używam klasy rozszerzenie dla querys LINQ znaleźć tutaj - http://code.msdn.microsoft.com/linqtosqlcache

mam okablowany kodu i kiedy otworzyć stronę otrzymuję ten wyjątek -

„SQL Server Service Broker dla bieżąca baza danych nie jest włączona, a w rezultacie powiadomienia o zapytaniach nie są obsługiwane. Włącz usługę Service Broker dla tej bazy danych, jeśli chcesz korzystać z powiadomień. "

jego przyjście z tego wydarzenia w global.asax

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

    } 

moje pytanie brzmi ...

  1. Jak włączyć Service Broker w moim serwera SQL 2008 bazy danych? Próbowałem uruchomić to zapytanie .. ALTER DATABASE tablename SET ENABLE_BROKER, ale nigdy się nie kończy i działa na zawsze, muszę ręcznie zatrzymać.

  2. raz mam ten zestaw w SQL Server 2008, czy będzie filtrować do mojego DataContext, czy też muszę coś tam skonfigurować?

dzięki za wszelką pomoc

Truegilly

Odpowiedz

28

ok tutaj jest, jak to zrobić, jeśli twój jest wyłączona lub trzeba przywrócić kopię zapasową, która wydaje się go wyłączyć.

wystarczy uruchomić ten skrypt, to zabije cały proces jest, że baza danych jest użycie (dlaczego carnt w 2008 ręcznie zabić procesowego w odróżnieniu od 2005 jest poza mną), a następnie ustawić broker

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 
+3

dodatkowych przydatnych informacji : aby sprawdzić, czy jest włączony, uruchom ... 'SELECT is_broker_enabled OD sys.databases WHERE name = 'Nazwa bazy danych'; - Gdzie "Nazwa bazy danych" to nazwa bazy danych, do której chcesz wysłać zapytanie.' – Myster

94

na wypadek gdyby ktoś w innym przypadku szuka rozwiązania tego problemu, następująca komenda zadziałała dla mnie świetnie. Uwalnia wszystkie pozostałe połączenia do bazy danych zamiast czekać.

ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE 
+4

działał jak wdzięk :) dziękuję –

27

w SQL Server 2012 można przejść do Properties-> Options -> Service Broker

Enable Service Broker

+0

To samo dla SQL 2008 sp3 (właśnie testowane) z najnowszym smss –

2

Wszystkie połączenia DB musi być usunięty i konto użytkownika z uprawnieniami używane, aby włączyć usługę pośrednika.

Poniższa byłby idealny (zastąpić 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; 

także Proponuję stworzenie nowej roli i konto użytkownika z odpowiednimi uprawnieniami (zastąpić logowanie do bazy danych):

--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';