zoukankan      html  css  js  c++  java
  • Service Broker between different instances by certificate.

     

    Initiator Instance:

    use master

    go

    /*

    1. create user, login, certificate and endpoint

    2. export the certificate

    */

    if not exists(select * from sys.symmetric_keys as sk where name = '##MS_DatabaseMasterKey##')

        create master key encryption by password = 'Password#123'

    go

     

    if exists(select * from sys.syslogins as s where name = 'initiator_user')

        drop login initiator_user

    go

     

    create login initiator_user with password = 'Password#123';

    go

     

    if exists(select * from sys.sysusers as s where s.name = 'initiator_user')

        drop user initiator_user;

    go

     

    create user initiator_user;

    go

     

    if exists(select * from sys.certificates where name = 'initiator_transport_cert')

        drop certificate initiator_transport_cert

    go

     

    create certificate initiator_transport_cert

    authorization initiator_user

    with subject = 'initiator transport certificate',start_date = '2011-01-01',expiry_date='2100-01-01';

    go

     

    backup certificate initiator_transport_cert

    to file = 'f:\initiator_transport.cert'

    go

     

    if exists(select * from sys.endpoints as e where e.name = 'service_broker_endpoint')

        drop endpoint service_broker_endpoint

    go

     

    create endpoint service_broker_endpoint

    state = started

    as tcp(listener_port = 4033)

    for service_broker(authentication = certificate initiator_transport_cert )

    go

     

    ------------------------------------------------------------------------------------------------------

    /*

    1. import certificate form target service

    2. grant permission to user

    */

    if exists(select * from sys.syslogins where name = 'target_user')

        drop login target_user

    go

     

    if exists(select * from sys.sysusers as s where name = 'target_user')

        drop user target_user;

    go

     

    if exists(select * from sys.certificates as c where name = 'target_transport_cert')

        drop certificate target_transport_cert

    go

     

     

    create login target_user with password = 'Password#123';

    go

     

    create user target_user for login target_user;

    go

     

    create certificate target_transport_cert

    authorization target_user

    from file = 'f:\target_transport.cert'

    go

     

    grant connect on endpoint::service_broker_endpoint to target_user;

    go

     

    if exists(select * from sys.databases as d where name = 'Initiator_Database')

        drop database Initiator_Database;

    go

    create database Initiator_Database;

    go

     

    use Initiator_Database

    go

    /*

    create queue, service and route

    */

     

    create message type ReceiveMessage validation = well_formed_xml;

    create message type ReplyMessage validation = well_formed_xml;

    go

    create contract SampleContract

    (ReceiveMessage sent by initiator,ReplyMessage sent by target);

    go

     

    create queue initiator_queue;

    go

     

    create service initiator_service

    on queue initiator_queue(SampleContract);

    go

     

    grant send on service::initiator_service to public;

    go

     

    create route target_route

    with service_name = 'target_service',

    address = 'tcp://dw-new:4033';

    go

     

    use msdb

    go

    create route initiator_route

    with service_name = 'initiator_route',

    address = 'local';

    go

     

    -----------------------------------------------------------------------------------------

    use Initiator_Database

    go

     

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;

    DECLARE @RequestMsg NVARCHAR(100);

     

    --BEGIN TRANSACTION;

    begin try

    begin dialog conversation @InitDlgHandle

    from service initiator_service

    to service 'target_service'

    on contract SampleContract

    with encryption = off;

     

    select @RequestMsg = '<RequestMsg>queue test</RequestMsg>';

     

    send on conversation @InitDlgHandle message type ReceiveMessage(@RequestMsg)

    end try

    begin catch

    select error_message();

    --end conversation @InitDlgHandle

    end catch

    --commit

    go

    select * from sys.transmission_queue as tq where tq.to_service_name = 'target_service'

    select * from sys.routes as r

    select d.service_broker_guid from sys.databases as d where d.database_id = db_id()

    -----------------------------------------------------------------------------------------

    DECLARE @RecvReplyMsg NVARCHAR(100);

    DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;

     

    --BEGIN TRANSACTION;

     

    WAITFOR

    ( RECEIVE TOP(1) @RecvReplyDlgHandle = conversation_handle,

        @RecvReplyMsg = message_body

    from initiator_queue

    ),timeout 1000;

     

    end conversation @RecvReplyDlgHandle;

     

    select @RecvReplyMsg as ReceivedReplyMessage

    --commit transaction

    go

    Target Instance:

    use master

    go

    /*

    1. create target user, certificate and endpoint

    2. export the certificate

    */

    if not exists(select * from sys.symmetric_keys as sk where name = '##MS_DatabaseMasterKey##')

        create master key encryption by password = 'Password#123';

    go

     

    if exists(select * from sys.syslogins where name = 'target_user')

        drop login target_user

    go

     

    create login target_user with password = 'Password#123';

    go

     

    if exists(select * from sys.sysusers as s where name = 'target_user')

        drop user target_user;

    go

     

    create user target_user;

    go

     

    if exists(select * from sys.certificates as c where name = 'target_transport_cert')

        drop certificate target_transport_cert;

    go

     

    create certificate target_transport_cert

    authorization target_user

    with subject = 'target transport certificate',start_date = '2011-01-01',expiry_date='2100-01-01';

    go

     

    backup certificate target_transport_cert

    to file = 'd:\cer\target_transport.cert'

    go

     

    if exists(select * from sys.endpoints as e where e.name = N'service_broker_endpoint')

        drop endpoint service_broker_endpoint

    go

     

    create endpoint service_broker_endpoint

    state = started

    as tcp(listener_port = 4033)

    for service_broker(authentication = certificate target_transport_cert)

    go

    select * from sys.endpoints as e

    select * from sys.routes as r

    ---------------------------------------------------------------------------------------------------------

     

    /*

    import certificate from initiator service

    grant the permission

    */

    if exists(select * from sys.syslogins as s where name = 'initiator_user')

        drop login initiator_user

    go

     

    if exists(select * from sys.certificates as c where name = 'initiator_transport_cert')

        drop certificate initiator_transport_cert

    go

     

    if exists(select * from sys.sysusers as s where s.name = 'initiator_user')

        drop user initiator_user;

    go

     

    create login initiator_user with password = 'Password#123';

    go

     

    create user initiator_user for login initiator_user;

    go

     

    create certificate initiator_transport_cert

    authorization initiator_user

    from file = 'd:\cer\initiator_transport.cert';

    go

     

    grant connect on endpoint::service_broker_endpoint to initiator_user;

    go

     

    if exists(select * from sys.databases as d where d.name = 'Target_Database')

        drop database Target_Database;

    go

     

    create database Target_Database

    go

     

    use Target_Database

    go

     

    /*

    create queue, service and routes

    */

     

    create message type ReceiveMessage validation = well_formed_xml;

    create message type ReplyMessage validation = well_formed_xml;

    go

    create contract SampleContract

    (ReceiveMessage sent by initiator,ReplyMessage sent by target);

    go

     

    create queue target_queue;

    go

     

    create service target_service

    on queue target_queue(SampleContract);

    go

     

    grant send on service::target_service to public;

    go

     

    --use msdb

    --go

    create route initiator_route

    with service_name = 'initiator_service',address = 'tcp://db1:4033';

    go

    use msdb

    go

    create route target_route

    with service_name = 'target_service',address = 'local';

    go

     

    use Target_Database

    go

     

    use Target_Database

    go

     

    ----------------------------------------------------------------

    DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;

    DECLARE @RecvReqMsg NVARCHAR(100);

    DECLARE @RecvReqMsgName sysname;

     

        declare @replmsg varchar(200)

    --BEGIN TRANSACTION;

    waitfor (receive top(1) @RecvReqDlgHandle = conversation_handle,

           @RecvReqMsg = message_body,

           @RecvReqMsgName = message_type_name

    from target_queue

    ),timeout 1000;

    select @RecvReqMsg as ReceivedRequestMessage;

     

    if @RecvReqMsg = '<RequestMsg>queue test</RequestMsg>'

    begin

        set @replmsg = '<ReplyMsg>reply message</ReplyMsg>';

        send on conversation @RecvReqDlgHandle(@replmsg);

       

        end conversation @RecvReqDlgHandle;

    end

    --commit transaction

     

    select * from sys.transmission_queue as tq

     

    select * from sys.dm_broker_queue_monitors as dbqm

  • 相关阅读:
    git的使用
    open():打开文件
    结合python+selenium使用AutoIt V3实现文件、图片上传
    Postman教程
    Python字符串切片
    python实现操作excel,数据写入excel的一行或者一列
    python打包exe
    spring boot基于DRUID数据源密码加密及数据源监控实现
    基于aop的日志记录方式实现
    Android中ContentProvider的简单使用
  • 原文地址:https://www.cnblogs.com/laoyumi/p/2104506.html
Copyright © 2011-2022 走看看