在本课中,你将学习如何创建发起程序数据库和本教程中使用的所有发起程序 Service Broker 对象。 从与数据库引擎发起方实例在同一台计算机上运行的 Management Studio 副本运行这些步骤。
过程
创建 Service Broker 端点
将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它,为此数据库引擎实例创建 Service Broker 终结点。 Service Broker 端点指定了将 Service Broker 消息发送到的网络地址。 该端点使用 Service Broker 默认 TCP 端口 4022,并指定数据库引擎远程实例将使用 Windows 身份验证连接来发送消息。
当两台计算机位于同一域中或位于受信任的域中时,Windows 身份验证有效。 如果计算机不在受信任的域中,请使用终结点的证书安全性。 有关详细信息,请参阅 如何:为 Service Broker 传输安全性创建证书。
USE master; GO IF EXISTS (SELECT * FROM sys.endpoints WHERE name = N'InstInitiatorEndpoint') DROP ENDPOINT InstInitiatorEndpoint; GO CREATE ENDPOINT InstInitiatorEndpoint STATE = STARTED AS TCP ( LISTENER_PORT = 4022 ) FOR SERVICE_BROKER ( AUTHENTICATION = WINDOWS ); GO
创建发起方数据库、主密钥和用户
复制以下代码并将其粘贴到查询编辑器窗口中。 更改语句的密码
CREATE MASTER KEY,然后运行代码以创建用于本教程的目标数据库。 默认情况下,新数据库的选项ENABLE_BROKER设置为“打开”。 该代码还会创建用于支持加密和远程连接的主密钥和用户。USE master; GO IF EXISTS (SELECT * FROM sys.databases WHERE name = N'InstInitiatorDB') DROP DATABASE InstInitiatorDB; GO CREATE DATABASE InstInitiatorDB; GO USE InstInitiatorDB; GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = N'<EnterStrongPassword2Here>'; GO CREATE USER InitiatorUser WITHOUT LOGIN; GO
创建发起方证书
复制以下代码并将其粘贴到查询编辑器窗口中。 更改语句中指定的
BACKUP CERTIFICATE文件名以引用系统上的文件夹。 然后,运行代码以创建用于加密消息的发起程序证书。 指定的文件夹的权限设置应当只允许 Windows 帐户和用于运行数据库引擎实例的 Windows 帐户访问该文件夹,其他帐户一概不能访问。 若要学习第 3 课,必须手动将 InstInitiatorCertificate.cer 文件复制到可从目标实例访问的文件夹。CREATE CERTIFICATE InstInitiatorCertificate AUTHORIZATION InitiatorUser WITH SUBJECT = N'Initiator Certificate', EXPIRY_DATE = N'12/31/2010'; BACKUP CERTIFICATE InstInitiatorCertificate TO FILE = N'C:\storedcerts\$ampleSSBCerts\InstInitiatorCertificate.cer'; GO
创建消息类型
将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它来创建对话的消息类型。 此处指定的消息类型名称和属性必须与在上一课中创建
InstTargetDB的消息类型名称和属性相同。CREATE MESSAGE TYPE [//BothDB/2InstSample/RequestMessage] VALIDATION = WELL_FORMED_XML; CREATE MESSAGE TYPE [//BothDB/2InstSample/ReplyMessage] VALIDATION = WELL_FORMED_XML; GO
创建协定
将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它来创建对话的协定。 此处指定的协定名称和属性必须与在下一课中创建
InstInitiatorDB的协定相同。CREATE CONTRACT [//BothDB/2InstSample/SimpleContract] ([//BothDB/2InstSample/RequestMessage] SENT BY INITIATOR, [//BothDB/2InstSample/ReplyMessage] SENT BY TARGET); GO
创建发起方队列和服务
将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它来创建用于目标的队列和服务。 该
CREATE SERVICE语句将服务与 InstInitiatorQueue 相关联。 因此,所有发送给此服务的消息都将被接收到 InstInitiatorQueue 中。 此外CREATE SERVICE,还指定只有使用前面创建的 BothDB/2InstSample/SimpleContract 的对话才能将服务用作目标服务。CREATE QUEUE InstInitiatorQueue; CREATE SERVICE [//InstDB/2InstSample/InitiatorService] AUTHORIZATION InitiatorUser ON QUEUE InstInitiatorQueue; GO
创建对目标对象的引用
复制以下代码并将其粘贴到查询编辑器窗口中。 更改子
FROM FILE句以引用从第 1 课中的步骤 3 复制 InstTargetCertificate.cer 文件的文件夹。 然后,运行代码以创建目标用户并请求目标证书。CREATE USER TargetUser WITHOUT LOGIN; CREATE CERTIFICATE InstTargetCertificate AUTHORIZATION TargetUser FROM FILE = N'C:\storedcerts\$ampleSSBCerts\InstTargetCertificate.cer'; GO
创建路由
复制以下代码并将其粘贴到查询编辑器窗口中。 将字符串 MyTargetComputer 更改为运行目标实例的计算机的名称。 然后,运行代码以创建指向目标服务和发起方服务的路由,并创建将 TargetUser 与目标服务路由相关联的远程服务绑定。
以下
CREATE ROUTE语句假定目标实例中没有重复的服务名称。 如果目标实例上的多个数据库具有具有相同名称的服务,请使用BROKER_INSTANCE子句指定要打开会话的数据库。DECLARE @Cmd AS NVARCHAR (4000); SET @Cmd = N'USE InstInitiatorDB; CREATE ROUTE InstTargetRoute WITH SERVICE_NAME = N''//TgtDB/2InstSample/TargetService'', ADDRESS = N''TCP://MyTargetComputer:4022'';'; EXECUTE (@Cmd); SET @Cmd = N'USE msdb CREATE ROUTE InstInitiatorRoute WITH SERVICE_NAME = N''//InstDB/2InstSample/InitiatorService'', ADDRESS = N''LOCAL'''; EXECUTE (@Cmd); GO CREATE REMOTE SERVICE BINDING TargetBinding TO SERVICE N'//TgtDB/2InstSample/TargetService' WITH USER = TargetUser; GO
相关任务
- 备份证书 (Transact-SQL)
- CREATE CERTIFICATE (Transact-SQL)
- CREATE CONTRACT (Transact-SQL)
- 创建数据库
- CREATE ENDPOINT (Transact-SQL)
- CREATE MASTER KEY (Transact-SQL)
- CREATE MESSAGE TYPE (Transact-SQL)
- CREATE QUEUE (Transact-SQL)
- 创建远程服务绑定 (Transact-SQL)
- CREATE ROUTE (Transact-SQL)
- CREATE SERVICE (Transact-SQL)
- 创建用户 (Transact-SQL)
- EXECUTE (Transact-SQL)
- sp_addlinkedserver(Transact-SQL)
- Service Broker 对话框安全性
- 对话体系结构
- 服务体系结构
后续步骤
你已成功为本教程创建了发起程序数据库。 接下来,通过创建依赖于发起程序对象的目标对象来完成目标数据库的配置。