none
Ein neu eingefügte Datensatz in eine Tabelle einer anderen Datenbank einfügen RRS feed

  • Frage

  • Hallo,

    Ich haben 2 Datenbanken mit je einen Tabelle. Diese Tabellen sind strukturell gleich und beide leer.

    Datenbanken sind:

    1. DB1,
    2. DB2

    Und die Tabellen:

    • tbFoo in DB1 und
    • tbFoo in DB2

    Ich möchte gerne folgende Szene verwirklichen:

    Immer wenn ein neuer Datensatz in die Tabelle tbFoo in DB1 eingefügt wird, soll dieser auch in die Tabelle tbFoo in DB2 automatisch hinzugefügt werden.

    Ich habe nach den möglichen Lösungen recherchiert aber leider nichts im Web gefunden. Vielleicht verwende ich einfach falsche Schlüsselwörter, ich weiß es nicht. Kann mir bitte jemand dabei helfen?

    Welche Möglichkeiten gibt es dafür?

    Welche ist der beste Weg?

    Ich würde mich auf eine schnelle Antwort sehr freuen.

    Vielen Dank im Voraus

    Donnerstag, 13. Juni 2013 10:19

Alle Antworten

  • Hierzu gibt es (mindestens) zwei Möglichkeiten.
    1.) Verwende einen Trigger, der bei einem Insert alle neuen Sätze überträgt. Änderungen (inkl. Löschungen) werden anscheinend nicht benötigt. Ansonsten musst Du den Trigger auch für DELETE und UPDATE schreiben.

    2.) Verwende eine View (welche auf die Tabelle in der ersten DB zeigt) in der zweiten Datenbank anstelle einer Tabelle. Hierdurch hast Du immer direkt den identischen Bestand wie in der ersten DB.

    Für weitere Hilfestellungen, solltest Du verraten, warum Du die Tabelle duplizieren willst und welche Aktionen auf der Tabelle in der zweiten Datenbank laufen sollen.
     Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu/

    Donnerstag, 13. Juni 2013 10:25
  • Hallo,

    eine Möglichkeit wäre, in DB1 auf der Tabellen einen INSERT Trigger zu verwenden, der gleich die Daten in DB2 schreibt. Bedenke aber, das im Standard die Datenbank-übergeifende Besitzverkettung abgeschaltet ist, d.h. der User, der in DB1 in die Tabelle Daten einfügt, genauso Schreibrechte auf der Tabelle in DB2 benötigt.
    Siehe auch Verwenden der Tabellen inserted und deleted

    Transaktions-Replikation wäre eine weitere Möglichkeit, für diesen kleinen Anwendungsfall aber etwas "oversized".


    Olaf Helper

    Blog Xing

    Donnerstag, 13. Juni 2013 10:26
  • Hierzu gibt es (mindestens) zwei Möglichkeiten.
    1.) Verwende einen Trigger, der bei einem Insert alle neuen Sätze überträgt. Änderungen (inkl. Löschungen) werden anscheinend nicht benötigt. Ansonsten musst Du den Trigger auch für DELETE und UPDATE schreiben.

    2.) Verwende eine View (welche auf die Tabelle in der ersten DB zeigt) in der zweiten Datenbank anstelle einer Tabelle. Hierdurch hast Du immer direkt den identischen Bestand wie in der ersten DB.

    Für weitere Hilfestellungen, solltest Du verraten, warum Du die Tabelle duplizieren willst und welche Aktionen auf der Tabelle in der zweiten Datenbank laufen sollen.
     Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu/

    Zunächst vielen Dank für Ihre schnelle Antwort. Die erste Datenbank ist eine OLTP-Datenbank. Darin fließen die Daten regelmäßig. Und die zweite Datenbank dient nur als eine Test-Datenbank, welche ich später als Grundlage für meine OLAP-Datenbank verwenden möchte. Die Dateien in der zweiten Datenbank werden also nach den Gruppen in die verschieden Tabellen verteilt (mittels XML-Techniken). 

    So... Ich möchte gerne zuerst einfach nur das Verfahren lernen, wie ich die Daten, die in der ersten DB neu eingefügt werden, auch in der zweiten Datenbank bekommen kann. Dazu bin ich dabei einen INSERT-Trigger zu schreiben. Dann werde ich auch die Delete- bzw Update-Triggern brauchen.

    Mein Problem ist; Ich weiß nur nicht, wie ich die zweiten Datenbank in der Code erwähnen soll. Habe ich es erklären können? :-) 

    Beste Grüße

    Ilay

    Donnerstag, 13. Juni 2013 10:54
  • Hallo,

    eine Möglichkeit wäre, in DB1 auf der Tabellen einen INSERT Trigger zu verwenden, der gleich die Daten in DB2 schreibt. Bedenke aber, das im Standard die Datenbank-übergeifende Besitzverkettung abgeschaltet ist, d.h. der User, der in DB1 in die Tabelle Daten einfügt, genauso Schreibrechte auf der Tabelle in DB2 benötigt.
    Siehe auch Verwenden der Tabellen inserted und deleted

    Transaktions-Replikation wäre eine weitere Möglichkeit, für diesen kleinen Anwendungsfall aber etwas "oversized".


    Olaf Helper

    Blog Xing

    Hallo, 

    vielen Dank für Ihre ebenso schnelle Antwort wie von Christoph.

    Wie ich auch oben erwähnt habe, bin ich gerade dabei einen Trigger zu schreiben. Für beide Datenbanken habe ich alle benötigte Rechte. 

    Ich brauche eigentlich alle Optionen/Möglichkeiten für meine Lösung, damit ich diese auch miteinander vergleichen kann. Transaktions-Replikation scheint auch sehr geeignet zu sein. Ich werde es gleich ausführlicher betrachten.

    Der Fall ist natürlich nicht sooo einfach, wie ich es beschildert habe :-) Ich habe es nur so viel verraten, wie für mein Problem nötig war. :-)

    Also vielen vielen Dank für Ihre Hilfe :-)


    • Bearbeitet ilay_ Donnerstag, 13. Juni 2013 11:04
    Donnerstag, 13. Juni 2013 11:03
  • Ich habe die Lösung gefunden :-)

    Um in einer SQL-Abfrage (SQL Server 2012) eine andere Datenbank (im gleichen Server) anzusprechen, fügen wir einfach die Datenbankname.dbo vor dem Tabellenname ein. 

    Beispiel:

    use MyDatenbank
    go
    
    INSERT INTO AnotherDB.dbo.Namespaces VALUES ('x','y','z')
    
    select *
    from AnotherDB.dbo.Namespaces

    Das Leben ist schön :-)

    Vielen Dank noch mal für eure Hilfe :-)

    Donnerstag, 13. Juni 2013 12:26
  • fügen wir einfach die Datenbankname.dbo vor dem Tabellenname ein. 

    Richtig, das nennt sich three part qualifier: DatabaseName.SchemaName.ObjectName

    Und wenn man über einen LinkedServer auf einen anderen SQL Server zugreifen will, gibt es den four part qualifier: ServerName.DatabaseName.SchemaName.ObjectName

    Siehe MSDN Verwenden von Bezeichnern als Objektnamen


    Olaf Helper

    Blog Xing

    Donnerstag, 13. Juni 2013 12:37

  • Richtig, das nennt sich three part qualifier: DatabaseName.SchemaName.ObjectName

    Und wenn man über einen LinkedServer auf einen anderen SQL Server zugreifen will, gibt es den four part qualifier: ServerName.DatabaseName.SchemaName.ObjectName

    Vielen herzlichen Dank :-)
    • Bearbeitet ilay_ Donnerstag, 13. Juni 2013 13:04
    Donnerstag, 13. Juni 2013 13:03
  • Gibt es andere Möglichkeiten eine andere Datenbank in einer SQL-Abfrage anzusprechen oder ist das der einzige Weg?
    Donnerstag, 13. Juni 2013 13:07
  • Das ist soweit die einzige Möglichkeit. Warum, "gefällt" sie Dir nicht?

    Olaf Helper

    Blog Xing

    Donnerstag, 13. Juni 2013 13:20
  • Hallo Ilay

    Du kannst allenfalls die Tabelle der anderen Datenbank hinter einer View (Sicht) "verstecken" und dann den Insert in diese View machen.

    Beispiel:

    View anlegen:

    CREATE VIEW vDeineTabelleInAndererDB AS
    SELECT *
      FROM AndereDB.dbo.DeineTabelle

    Nun kannst Du im Insert Trigger folgenden Code benutzen (ungetesteter Code)

    INSERT INTO vDeineTabelleInAndererDB
    SELECT * FROM INSERTED

    Dies hat den Vorteil, dass Du künftig nur Deine View ändern musst, um die Kopie der Datensätze in eine andere Datenbank laufen zu lassen.

    HTH

    Henry

    Freitag, 14. Juni 2013 06:15
  • Statt über eine View ginge es auch über ein Synonym, das geht auch DB übergreifend.

    CREATE SYNONYM [dbo].[TabelleInDB2] FOR [DB2].[dbo].[Tabelle]


    Olaf Helper

    Blog Xing

    Freitag, 14. Juni 2013 06:22
  • Das ist soweit die einzige Möglichkeit. Warum, "gefällt" sie Dir nicht?

    Olaf Helper

    Blog Xing

    :-) Doch, natürlich hat es mir gefallen. Nur ich würde gerne auch die andere Möglichkeiten kennen lernen, falls es sie gibt.

    Und super, dass es auch welche gibt :-)

    Vielen vielen vielen Dank Henry, Olaf und Christoph. Ihr seid sehr nett :-)

    Mittwoch, 19. Juni 2013 08:29