52

我正在集成 SqlCacheDependency 以在我的 LinqToSQL 数据上下文中使用。

我正在为此处找到的 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,还是我也需要在那里配置一些东西?

谢谢你的帮助

特鲁吉利

4

6 回答 6

120

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

ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
于 2011-01-24T05:21:58.457 回答
44

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

启用服务代理

于 2014-05-22T11:04:09.963 回答
32

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

只需运行此脚本,它将杀死数据库正在使用的所有进程(为什么您在 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
于 2010-06-03T21:49:14.630 回答
5

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

以下将是理想的(替换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';
于 2015-08-20T15:43:40.343 回答
0

我们可以通过 ALTER DATABASE 语句启用代理服务,也可以从数据库属性 > 选项 > 服务代理 > 代理启用:真/假。

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

于 2020-07-28T08:32:08.797 回答
0
  1. Service Broker 输出错误。图 1

  2. 要修复,请使用 SSMS 启用服务代理,图 2

  3. 设置为 true 后,Service Broker 错误现在应该消失了,请参阅我的图 3

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

于 2022-02-06T02:48:55.527 回答