Fragensteller
Ein neu eingefügte Datensatz in eine Tabelle einer anderen Datenbank einfügen

Frage
-
Hallo,
Ich haben 2 Datenbanken mit je einen Tabelle. Diese Tabellen sind strukturell gleich und beide leer.
Datenbanken sind:
- DB1,
- 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
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/ -
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 deletedTransaktions-Replikation wäre eine weitere Möglichkeit, für diesen kleinen Anwendungsfall aber etwas "oversized".
Olaf Helper
Blog Xing -
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
-
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 deletedTransaktions-Replikation wäre eine weitere Möglichkeit, für diesen kleinen Anwendungsfall aber etwas "oversized".
Olaf Helper
Blog XingHallo,
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
-
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 :-)
-
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 -
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
- Bearbeitet ilay_ Donnerstag, 13. Juni 2013 13:04
-
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
-
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 :-)