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

新建日期: 2007 年 9 月 15 日

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

过程

创建 Service Broker 端点

  1. 复制以下代码并粘贴至查询编辑器窗口中。 然后,运行该代码以为数据库引擎的此实例创建 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
    

创建发起方数据库、主密钥和用户

  1. 复制以下代码并粘贴至查询编辑器窗口中。 在 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
    

创建发起方证书

  1. 复制以下代码并粘贴至查询编辑器窗口中。 更改 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
    

创建消息类型

  1. 复制以下代码并粘贴至查询编辑器窗口中。 然后,运行代码以创建会话的消息类型。 此处指定的消息类型名称和属性必须与上一课 InstTargetDB 中创建的消息类型名称和属性相同。

    CREATE MESSAGE TYPE [//BothDB/ 2InstSample/RequestMessage]
           VALIDATION = WELL_FORMED_XML;
    CREATE MESSAGE TYPE [//BothDB/ 2InstSample/ReplyMessage]
           VALIDATION = WELL_FORMED_XML;
    GO
    

创建约定

  1. 复制以下代码并粘贴至查询编辑器窗口中。 然后,运行该代码以创建会话的约定。 此处指定的约定名称和属性必须与下一课 InstInitiatorDB 中创建的约定名称和属性相同。

    CREATE CONTRACT [//BothDB/ 2InstSample/SimpleContract]
          ([//BothDB/ 2InstSample/RequestMessage]
             SENT BY INITIATOR,
           [//BothDB/ 2InstSample/ReplyMessage]
             SENT BY TARGET
          );
    GO
    

创建发起方队列和服务

  1. 复制以下代码并粘贴至查询编辑器窗口中。 然后,运行该代码以创建用于目标的队列和服务。 CREATE SERVICE 语句可将服务与 InstInitiatorQueue 关联起来。 因此,所有发送至该服务的消息都将被接收到 InstInitiatorQueue 中。 CREATE SERVICE 还指定只有使用先前创建的 //BothDB/ 2InstSample/SimpleContract 的会话才能将该服务用作目标服务。

    CREATE QUEUE InstInitiatorQueue;
    
    CREATE SERVICE [//InstDB/2InstSample/InitiatorService]
           AUTHORIZATION InitiatorUser
           ON QUEUE InstInitiatorQueue;
    GO
    

创建对目标对象的引用

  1. 复制以下代码并粘贴至查询编辑器窗口中。 更改 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
    

创建路由

  1. 复制以下代码并粘贴至查询编辑器窗口中。 将字符串 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 课:完成目标会话对象

请参阅

其他资源

BACKUP CERTIFICATE (Transact-SQL)
CREATE CERTIFICATE (Transact-SQL)
CREATE CONTRACT (Transact-SQL)
CREATE DATABASE (Transact-SQL)
CREATE ENDPOINT (Transact-SQL)
CREATE MASTER KEY (Transact-SQL)
CREATE MESSAGE TYPE (Transact-SQL)
CREATE QUEUE (Transact-SQL)
CREATE REMOTE SERVICE BINDING (Transact-SQL)
CREATE ROUTE (Transact-SQL)
CREATE SERVICE (Transact-SQL)
CREATE USER (Transact-SQL)
EXECUTE (Transact-SQL)
sp_addlinkedserver (Transact-SQL)
Service Broker 对话安全模式
会话体系结构
服务体系结构

帮助和信息

获取 SQL Server 2005 帮助