Включение компонента Service Broker в SQL Server 2008 - PullRequest
46 голосов
/ 03 мая 2010

Я интегрирую 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. как включить компонент Service Broker в моей базе данных SQL Server 2008? Я пытался выполнить этот запрос .. ALTER DATABASE tablename SET ENABLE_BROKER, но он никогда не заканчивается и не работает вечно, я должен остановить его вручную.

  2. как только у меня будет этот набор в SQL Server 2008, он будет фильтроваться до моего DataContext или мне тоже нужно что-то там настраивать?

спасибо за любую помощь

Truegilly

Ответы [ 4 ]

104 голосов
/ 24 января 2011

В случае, если кто-то еще ищет решение этой проблемы, следующая команда отлично сработала для меня. Он освобождает все остальные соединения с базой данных вместо ожидания.

ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
35 голосов
/ 22 мая 2014

В Sql Server 2012 вы можете перейти на Properties-> Options -> Service Broker

Enable Service Broker

31 голосов
/ 04 июня 2010

Хорошо, вот как это сделать, если у вас отключено или вам нужно восстановить резервную копию, которая, кажется, отключает ее.

просто запустите этот сценарий, он уничтожит все процессы, которые использует база данных (почему вы выполняете ручную обработку в 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 голосов
/ 20 августа 2015

Все соединения с БД должны быть разорваны, а учетная запись пользователя с разрешениями должна использоваться для включения службы посредника.

Было бы идеально следующее (замените 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';
...