代码之家  ›  专栏  ›  技术社区  ›  JGilmartin

在SQL Server 2008中启用Service Broker

  •  45
  • JGilmartin  · 技术社区  · 16 年前

    我正在集成要在LinqToSQL DataContext中使用的SqlCacheDependency。

    我正在使用此处找到的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启用\u broker,但它永远不会结束和运行,我必须手动停止它。

    2. 一旦我在SQL Server 2008中设置了这个集,它会过滤到我的DataContext吗,还是需要在那里配置一些东西?

    谢谢你的帮助

    特鲁吉利

    4 回复  |  直到 11 年前
        1
  •  102
  •   Matt    15 年前

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

    ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
    
        2
  •  35
  •   Dragos Durlut    12 年前

    在SQL Server 2012中,可以转到 properties->options->service broker

    Enable Service Broker

        3
  •  30
  •   JGilmartin    13 年前

    如果您的备份被禁用,或者您需要还原一个备份,那么下面是如何执行此操作的,这似乎会禁用它。

    只需运行这个脚本,它就会终止数据库正在使用的所有进程(为什么在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
    
        4
  •  3
  •   kittykittybangbang    11 年前

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

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