سؤال

أقوم بدمج sqlcachedependency لاستخدامه في datacontext linqtoSQL.

أنا أستخدم فئة تمديد لـ LINQ Quarys الموجودة هنا - http://code.msdn.microsoft.com/linqtoSqlcache

لقد قمت بتوصيل الرمز وعندما أفتح الصفحة أحصل على هذا الاستثناء -

"لم يتم تمكين وسيط خدمة SQL Server لقاعدة البيانات الحالية ، ونتيجة لذلك ، لا يتم دعم إشعارات الاستعلام. يرجى تمكين وسيط الخدمة لهذه قاعدة البيانات إذا كنت ترغب في استخدام الإخطارات."

إنه يأتي من هذا الحدث في 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 الخاصة بي؟ لقد حاولت تشغيل هذا الاستعلام .. تغيير قاعدة البيانات tablename set enable_broker ولكنه لا ينتهي أبدًا ويدير إلى الأبد ، يجب أن أوقفه يدويًا.

  2. بمجرد أن أحصل على هذه المجموعة في SQL Server 2008 ، هل سيتم تصفية إلى DataContext ، أو هل أحتاج إلى تكوين شيء هناك أيضًا؟

شكرا على اي مساعدة

Truegilly

هل كانت مفيدة؟

المحلول 3

حسنًا ، إليك كيفية القيام بذلك إذا تم تعطيل لك أو كنت بحاجة إلى استعادة نسخة احتياطية ، والتي يبدو أنها تعطلها.

ما عليك سوى تشغيل هذا البرنامج النصي ، فسيقتل كل العمليات التي تستخدمها قاعدة البيانات (لماذا لا تقتل في عام 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

نصائح أخرى

في حال كان أي شخص آخر يبحث عن حل لهذه المشكلة ، فقد عمل الأمر التالي بشكل رائع بالنسبة لي. يطلق جميع الاتصالات الأخرى إلى قاعدة البيانات بدلاً من الانتظار.

ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE

في SQL Server 2012 يمكنك الذهاب إلى Properties-> Options -> Service Broker

Enable Service Broker

يجب إسقاط جميع الاتصالات إلى DB وحساب المستخدم مع أذونات تستخدم لتمكين خدمة الوسيط.

ما يلي سيكون مثاليًا (استبدال 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';
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top