第 2 课:创建发起方数据库

在本课中,您将学习创建发起方数据库和所有本教程中使用的发起方 Service Broker 对象。从与数据库引擎发起方实例运行在同一台计算机上的 Management Studio 副本中执行这些步骤。

过程

创建 Service Broker 端点

  • 复制以下代码并将其粘贴到查询编辑器窗口中。然后,运行代码为此数据库引擎实例创建 Service Broker 端点。Service Broker 端点指定了 Service Broker 消息发送到的网络地址。该端点使用 Service Broker 默认 TCP 端口 4022,指定将使用 Windows 身份验证连接来发送消息的数据库引擎远程实例。

    Windows 身份验证在两台计算机处于相同的域或可信任域中时有效。如果计算机不在可信任的域中,请将证书安全设置用于端点。有关详细信息,请参阅如何为 Service Broker 传输安全模式创建证书 (Transact-SQL)

    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 选项设置为 ON。该代码还会创建用于支持加密和远程连接的主密钥和用户。

    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 中将 InstTargetCertficate.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 NVARCHAR(4000);
    
    SET @Cmd = N'USE InstInitiatorDB;
    CREATE ROUTE InstTargetRoute
    WITH SERVICE_NAME =
           N''//TgtDB/2InstSample/TargetService'',
         ADDRESS = N''TCP://MyTargetComputer:4022'';';
    
    EXEC (@Cmd);
    
    SET @Cmd = N'USE msdb
    CREATE ROUTE InstInitiatorRoute
    WITH SERVICE_NAME =
           N''//InstDB/2InstSample/InitiatorService'',
         ADDRESS = N''LOCAL''';
    
    EXEC (@Cmd);
    GO
    CREATE REMOTE SERVICE BINDING TargetBinding
          TO SERVICE
             N'//TgtDB/2InstSample/TargetService'
          WITH USER = TargetUser;
    
    GO
    

后续步骤

您已经成功创建了将要用于本教程的发起方数据库。接下来,您将通过创建与发起方对象存在依赖关系的目标对象来完成对目标数据库的配置。请参阅第 3 课:完成目标会话对象