2010-05-03 89 views
38

我正在整合SqlCacheDependency以在我的LinqToSQL數據上下文中使用。在SQL Server 2008中啓用Service Broker

我使用的LINQ querys的擴展類在這裏找到 - http://code.msdn.microsoft.com/linqtosqlcache

我已經連接好代碼,當我打開網頁我得到這個例外 -

「SQL Server服務代理的當前數據庫未啓用,因此不支持查詢通知。如果希望使用通知,請爲此數據庫啓用Service Broker。「

它從這個事件來在Global.asax

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

    } 

我的問題是...

  1. 我如何在我的SQL Server 2008數據庫啓用Service Broker的?我試圖運行這個查詢.. ALTER DATABASE tablename SET ENABLE_BROKER但它永遠不會結束並永遠運行,我必須手動停止它。

  2. 一旦我在SQL Server 2008中有這樣的設置,它會過濾掉我的DataContext,還是我需要配置一些東西呢?

感謝您的幫助

Truegilly

回答

28

確定這裏是如何做到這一點,如果你是殘障人士,或者您需要恢復備份,這似乎禁用它。

只需運行該腳本,它會殺死所有的過程是一個數據庫使用(爲什麼你在2008年carnt手動殺進程的不像2005年我是無法理解),然後設置代理

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

其他有用信息:查看是否啓用運行... SELECT is_broker_enabled FROM sys.databases WHERE name ='Database name'; - 其中「數據庫名稱」是要查詢的數據庫的名稱。' – Myster 2011-05-27 02:07:08

94

如果任何人否則正在尋找解決這個問題的方法,下面的命令對我來說很好。它釋放到數據庫的所有其他連接,而不是等待。

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

就像一個魅力工作:)謝謝 – 2014-07-29 10:30:02

27

在SQL Server 2012中,你可以去Properties-> Options -> Service Broker

Enable Service Broker

+0

相同的SQL 2008 SP3(剛剛測試)與最新的smss – 2015-12-21 10:35:33

2

到數據庫的所有連接都必須被丟棄,並與權限的用戶帳戶用於啓動代理服務。

以下是理想的(更換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; 

此外,我建議建立有相應權限的新角色和用戶帳戶(更換數據庫的登錄):

--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'; 
相關問題