在 SQL Server 2008 中启用服务代理
Posted
技术标签:
【中文标题】在 SQL Server 2008 中启用服务代理【英文标题】:Enabling Service Broker in SQL Server 2008 【发布时间】:2010-05-03 15:02:28 【问题描述】:我正在集成 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);
我的问题是……
如何在我的 SQL Server 2008 数据库中启用 Service Broker?我已尝试运行此查询.. ALTER DATABASE tablename SET ENABLE_BROKER 但它永远不会结束并永远运行,我必须手动停止它。
一旦我在 SQL Server 2008 中设置了这个,它会过滤到我的 DataContext,还是我也需要在那里配置一些东西?
感谢您的帮助
真吉利
【问题讨论】:
【参考方案1】:如果其他人正在寻找解决此问题的方法,以下命令对我来说非常有用。它释放与数据库的所有其他连接,而不是等待。
ALTER DATABASE [DBNAME] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
【讨论】:
如果您在启用代理时遇到问题,抱怨已启用具有相同 ID 的代理,例如无法启用数据库“DatabaseName”中的服务代理,因为已启用具有相同 ID 的服务代理。您可以通过以下命令重置代理 ID:ALTER DATABASE [DatabaseName] SET NEW_BROKER
Credits to:mssqltips.com/sqlservertip/2789/…【参考方案2】:
在 Sql Server 2012 中你可以去Properties-> Options -> Service Broker
【讨论】:
SQL 2008 sp3(刚刚测试)与最新的短信相同 SQL 2016 相同,刚刚测试。【参考方案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
【讨论】:
附加有用信息:查看是否启用运行...SELECT is_broker_enabled FROM sys.databases WHERE name = 'Database name'; -- Where 'Database name' is the name of the database you want to query.
【参考方案4】:
必须删除与数据库的所有连接,并使用具有启用代理服务权限的用户帐户。
以下是理想的(替换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';
【讨论】:
【参考方案5】:我们可以通过 ALTER DATABASE 语句启用代理服务,也可以从数据库属性 > 选项 > 服务代理 > 代理启用:真/假。
但是在启用代理时出现问题:进程正在使用特定数据库运行,我们必须杀死这些进程,然后才能启用代理服务。 @JGilmartin 的回答将完美运行,但请确保它会杀死数据库的所有正在进行的进程,然后在生产中使用此脚本之前请检查流量或进程的严重性。
【讨论】:
【参考方案6】:Service Broker 输出错误。图 1
要修复,请使用 SSMS 启用服务代理,图 2
设置为 true 后,Service Broker 错误现在应该消失了,请参阅我的图片 3
【讨论】:
以上是关于在 SQL Server 2008 中启用服务代理的主要内容,如果未能解决你的问题,请参考以下文章
解决 安装SQl 2008为SQL Server代理服务提供的凭据无效
在完整版的sql server 2008R2上禁用SQL Server代理的安装