在SQL Server 2008中启用Service Broker

时间:2010-05-03 15:02:28

标签: asp.net linq caching datacontext sqlcachedependency

我正在集成SqlCacheDependency以在我的LinqToSQL datacontext中使用。

我正在使用此处找到的Linq查询的扩展类 - http://code.msdn.microsoft.com/linqtosqlcache

我已经连接了代码,当我打开页面时,我得到了这个例外 -

“当前数据库的SQL Server Service Broker未启用,因此不支持查询通知。如果您希望使用通知,请为此数据库启用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,还是我还需要配置它?

  3. 感谢您的帮助

    Truegilly

5 个答案:

答案 0 :(得分:103)

如果其他人正在寻找这个问题的解决方案,以下命令对我来说非常有用。它释放与数据库的所有其他连接,而不是等待。

ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE

答案 1 :(得分:35)

在Sql Server 2012中,您可以转到Properties-> Options -> Service Broker

Enable Service Broker

答案 2 :(得分:31)

好的,这里是如何执行此操作,如果您的禁用或您需要恢复备份,这似乎禁用它。

只运行这个脚本,它会杀死数据库正在使用的所有进程(为什么你在2008年手动杀死进程的方式与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 :(得分:3)

必须删除与数据库的所有连接以及具有用于启用代理服务的权限的用户帐户。

以下是理想的(替换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';

答案 4 :(得分:0)

我们可以通过ALTER DATABASE语句以及从数据库属性>选项> Service Broker> Broker Enable:True / False启用Broker服务。

但是在启用代理程序时在此处发出问题:进程正在使用特定的数据库运行,我们必须杀死这些数据库,然后才能启用代理程序服务。由 @JGilmartin 回答的用户可以很好地工作,但是在生产中使用此脚本之前,请确保它将杀死数据库中所有正在进行的进程,并请检查流量或进程的严重性。