第 2 课:创建发起程序数据库

适用于SQL ServerAzure SQL 托管实例

在本课中,你将学习如何创建发起程序数据库和本教程中使用的所有发起程序 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
    

后续步骤

你已成功为本教程创建了发起程序数据库。 接下来,通过创建依赖于发起程序对象的目标对象来完成目标数据库的配置。