Cad*_*oux 6 sql-server service-broker
根据我目前的理解,服务的名称对于实例是全局的,您可以在不知道哪个数据库包含服务和关联队列等的情况下引用它们。此外,您可以在同一实例的不同数据库中拥有相同的服务,并且在这种情况下,您应该使用路由,也可以在开始对话对话时使用 service_broker_guid 来区分它们。
有没有比在所有数据库中查看服务名称存在于哪些数据库中更好的方法?
sys.services 目录视图仅限于特定数据库上下文中,可以是当前数据库,也可以使用完全限定的 database_name.sys.services 进行调用。
特别是,我有一些触发器需要向另一个数据库中的服务发送消息,但是如果服务不存在,或者如果该服务有两个数据库,或者数据库名称是不同等
如果性能太慢而无法每次都在触发器中进行所有这些安全检查,我可以进行定期维护检查以删除它们,但是无论触发器是否一直存在,我仍然想知道是否有最好的方法服务在实例中完全定义在一个或多个数据库中。
我确实设法提出了这个动态 SQL,但这可能必须在 proc 或其他东西中进行:
USE master;
DECLARE @DatabasePattern AS varchar(max) = '%';
DECLARE @ServicePattern AS varchar(max) = '%';
DECLARE @SQLTemplate AS varchar(max) = 'UNION ALL
SELECT database_id = {database_id}
, database_name = ''{database_name}''
, service_name = s.[name]
, service_broker_guid = ''{service_broker_guid}''
FROM {database_name}.sys.services s
WHERE s.[name] LIKE ''' + REPLACE(@ServicePattern, '''', '''''') + '''
';
DECLARE @SQL AS varchar(max);
WITH Statements AS (
SELECT SQL = REPLACE(REPLACE(REPLACE(@SQLTemplate
,'{database_id}', db.[database_id])
,'{database_name}', REPLACE(db.[name], '''', ''''''))
,'{service_broker_guid}', db.[service_broker_guid])
FROM sys.databases db
WHERE db.[is_broker_enabled] = 1
AND db.[name] LIKE @DatabasePattern
)
SELECT @SQL = STUFF((SELECT SQL
FROM Statements
FOR XML PATH (''), TYPE).value('.', 'varchar(max)'), 1, LEN('UNION ALL'), '');
EXEC (@SQL);
Run Code Online (Sandbox Code Playgroud)
您可以在同一实例的不同数据库中拥有相同的服务,在这种情况下,您应该在开始对话时使用 service_broker_guid 来区分它们
不可以。通常,您应该让Service Broker Routing为新对话找到正确的目标服务。如果 SQL 实例上有多个同名服务,则默认行为是在匹配的代理实例之间循环新对话。如果您希望从针对服务的数据库发起的所有对话都b路由到特定数据库,请在发起数据库中添加一条路由,指定目标数据库的broker_id。例如
CREATE ROUTE b_route
WITH
SERVICE_NAME = 'b',
BROKER_INSTANCE = 'EF782150-7F7B-4544-937E-B03CF2A3248C',
ADDRESS = 'LOCAL' ;
Run Code Online (Sandbox Code Playgroud)
这允许您在部署时指定路由,并且您的 Service Broker 代码不需要指定目标 Broker 实例。
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |