none
DB Changes to Service Broker RRS feed

  • Frage

  • Hi,

    Is it possible to trigger a Database and send automatic new Items (changes) to a Service Broker Queue DB ?

    All should work only in the SQL Engine.

     

    Example:

    DB (Name: TEST ) with one Tabel   --- get Changes (new Items) to -> DB (Name: Service Broker)  --> Messege Queue

    Thx

    Christoph

    Freitag, 20. Januar 2012 10:26

Antworten

  • Hallo Christoph,
    wo genau hängst Du und wie soll das Ergebnis aussehen?
    Zunächst einmal, alle neu eingefügten Datensätze stehen im Trigger in der virtuellen Tabelle "inserted" zur Verfügung, mit der Du weiter arbeiten kannst; siehe auch MSDN Verwenden der Tabellen inserted und deleted.
    Die Message Queue aus dem Beispiel erwartet nur ein Well-Formed XML und keine feste Struktur (Message).
    Am einfachsten kann Du nun mit der FOR XML Klausel in einem SELECT Statement arbeiten, um die Daten in XML umzuwandeln, siehe MSDN Erstellen von XML mithilfe von FOR XML.
    Auf die Art könnest Du die Datensätze aus "inserted" in XML umwandeln und an Deine Stored Procedure übergeben.
    Ein Beispiel für FOR XML sieht so aus; wenn Du es in SSMS ausführst, bekommst Du im Ergebnis einen Link und wenn Du dort draufklickst, siehst Du das XML als Ergebnis:
     
    SELECT name
          ,type_desc
    FROM sys.objects
         FOR XML PATH('myMessage')
    
     
    <myMessage>
      <name>sysrscols</name>
      <type_desc>SYSTEM_TABLE</type_desc>
    </myMessage>
    <myMessage>
      <name>sysrowsets</name>
      <type_desc>SYSTEM_TABLE</type_desc>
    </myMessage>
    <myMessage>
      <name>sysallocunits</name>
      <type_desc>SYSTEM_TABLE</type_desc>
    </myMessage>
    <myMessage>
      <name>sysfiles1</name>
      <type_desc>SYSTEM_TABLE</type_desc>
    </myMessage>
     

    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Montag, 23. Januar 2012 17:00
  • Danke Olaf!

     

    inserted war das was ich gesucht habe.

     

     

    USE [DB];
    GO
    
    CREATE TRIGGER  trig 
    ON DBTabelle
    AFTER INSERT 
    AS
    
    DECLARE @T_DATA varchar(8000)
    set @T_DATA = (SELECT * FROM inserted FOR XML auto);
              
    EXEC [Ziel].[dbo].[PROC]  @Data = @T_DATA;
    GO 


    Gruß Christoph


    Dienstag, 24. Januar 2012 08:36

Alle Antworten

  • Hello Christoph,

    Because this is a German forum I am going to answer in German; if this is problem for you, please give a brief reply.

    Natürlich is es problemlos möglich, aus einem DDL oder DML Trigger heraus Nachrichten an eine Message Queue zu senden. Für konkrete Beispiel müsste man aber Deine konkreten Anforderungen wissen, besonders was Du mit "new items" meinst.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Sonntag, 22. Januar 2012 10:13
  • Hallo Olaf,

    Sorry .. ich dachte ich bin im US Forum.

     

    Nun ich habe bis jetzt eine Service Broker DB nach diesem Beispiel erstellt.

    http://blogs.msdn.com/b/steven_bates/archive/2006/01/05/simple-service-broker-message-queue.aspx

    (Funktioniert auch gut)

     

    Als "Zwischenhändle" benutze ich eine PROCEDURE:

     

    CREATE PROCEDURE [dbo].[TESTPROC]
    (
     @Data XML
    )
    AS
    BEGIN
    
    DECLARE @handle uniqueidentifier
    BEGIN DIALOG CONVERSATION @handle
    FROM SERVICE MYSendingService
    TO SERVICE 'MYReceivingService'
    ON CONTRACT MYContract;
    WITH ENCRYPTION = OFF;
    SEND ON CONVERSATION @handle
    MESSAGE TYPE MYMSG(@Data);
     
    END



     

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

    Nun zum Trigger:

    Ich habe eine Tabelle (dbo.changes) in einer separaten DB (XXX)

    Ich möchte nun den ganzen "Neuen Inhalt" an die PROCEDURE übergaben:

     

     

     USE [XXX];
    GO

    CREATE TRIGGER trig1
    ON dbo.changes
    AFTER INSERT
    AS
    DECLARE @INHALT NVARCHAR(200)

    EXEC [XXX].[dbo].[TESTPROC] @Data =@INHALT;

    GO


    An dem Punkt hänge ich momentan.  (@INHALT)

    INHALT = die neu hinzugekommene Row mit 8 Colums

     

    Kann man beim Trigger dort etwas abfangen ?

    (Letzte Insert Row -> @INHALT)

     

    Gruß Christoph


     

     

     


    Montag, 23. Januar 2012 08:23
  • Hallo Christoph,
    wo genau hängst Du und wie soll das Ergebnis aussehen?
    Zunächst einmal, alle neu eingefügten Datensätze stehen im Trigger in der virtuellen Tabelle "inserted" zur Verfügung, mit der Du weiter arbeiten kannst; siehe auch MSDN Verwenden der Tabellen inserted und deleted.
    Die Message Queue aus dem Beispiel erwartet nur ein Well-Formed XML und keine feste Struktur (Message).
    Am einfachsten kann Du nun mit der FOR XML Klausel in einem SELECT Statement arbeiten, um die Daten in XML umzuwandeln, siehe MSDN Erstellen von XML mithilfe von FOR XML.
    Auf die Art könnest Du die Datensätze aus "inserted" in XML umwandeln und an Deine Stored Procedure übergeben.
    Ein Beispiel für FOR XML sieht so aus; wenn Du es in SSMS ausführst, bekommst Du im Ergebnis einen Link und wenn Du dort draufklickst, siehst Du das XML als Ergebnis:
     
    SELECT name
          ,type_desc
    FROM sys.objects
         FOR XML PATH('myMessage')
    
     
    <myMessage>
      <name>sysrscols</name>
      <type_desc>SYSTEM_TABLE</type_desc>
    </myMessage>
    <myMessage>
      <name>sysrowsets</name>
      <type_desc>SYSTEM_TABLE</type_desc>
    </myMessage>
    <myMessage>
      <name>sysallocunits</name>
      <type_desc>SYSTEM_TABLE</type_desc>
    </myMessage>
    <myMessage>
      <name>sysfiles1</name>
      <type_desc>SYSTEM_TABLE</type_desc>
    </myMessage>
     

    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Montag, 23. Januar 2012 17:00
  • Danke Olaf!

     

    inserted war das was ich gesucht habe.

     

     

    USE [DB];
    GO
    
    CREATE TRIGGER  trig 
    ON DBTabelle
    AFTER INSERT 
    AS
    
    DECLARE @T_DATA varchar(8000)
    set @T_DATA = (SELECT * FROM inserted FOR XML auto);
              
    EXEC [Ziel].[dbo].[PROC]  @Data = @T_DATA;
    GO 


    Gruß Christoph


    Dienstag, 24. Januar 2012 08:36