تمكين وسيط الخدمة في SQL Server 2008
-
02-10-2019 - |
سؤال
أقوم بدمج 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);
}
سؤالي هو...
كيف يمكنني تمكين وسيط الخدمة في قاعدة بيانات SQL Server 2008 الخاصة بي؟ لقد حاولت تشغيل هذا الاستعلام .. تغيير قاعدة البيانات tablename set enable_broker ولكنه لا ينتهي أبدًا ويدير إلى الأبد ، يجب أن أوقفه يدويًا.
بمجرد أن أحصل على هذه المجموعة في 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
يجب إسقاط جميع الاتصالات إلى 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';