Einzelnen Beitrag anzeigen

omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#1

SQL - Spalten -> Spalte (ohne die Spalten zukennen)

  Alt 18. Sep 2005, 12:21
Datenbank: MSSQL • Version: 2k • Zugriff über: DBExpress
So, nun ist es mal soweit.

Dies ist meine erste Frage in diesem Forum, bis jetzt habe ich immer nur anderen geholfen.
Nun hoffe ich, dass ihr mir auch mal helfen könnt...

Ich möchte/muss den Inhalt einer Datenbank in eine andere (identische) Datenbank bringen.
Dabei sollen aber nur die Zeilen übertragen werden, die sich seit der letzten Aktualisierung geändert haben. Und es soll für alle Tabellen funktionieren (auch die, die es noch gar nicht gibt).
Also, wenn man mal irgendwo eine Spalte hinzufügt, dann soll das auch automatisch übertragen werden (natürlich müssen beide Datenbanken vom Aufbau her gleich sein).

So, hoffe das Problem ist soweit verständlich.

Ich habe schon einiges ausprobiert, stosse aber leider immer wieder an Grenzen.
Also, die Idee ist folgende...

Alle Tabellen, die übertragen werden sollen bekommen jeweils einen Trigger für INSERT, UPDATE, DELETE.
Dann gibt es eine Tabelle, in der die Änderungszeilen eingetragen werden. Diese Tabelle hat drei Spalten: Status (INSERT, UPDATE, DELETE), Tabellenname, Primary-Key-Inhalt (alles Textfelder)
Ein Übertragungprogramm (Delphi) soll dann die Zeilen aus dieser Tabelle an den anderen Server übertragen. Dort wird dann über ein anderes Delphiprogramm der Inhalt in der anderen Datenbank aktualisiert.

Ich habe jetzt schon eine Stored Procedure auf dem Original-DB-Server angelegt, die mir ein SQL-Statement zusammenbaut, dass nur noch den Inhalt der Primary-Key-Felder in einer Spalte zusammenbaut.
Also nochmal auf deutsch:

ich habe eine Tabelle (ID, Datum, Bezeichnung), ID und Datum sind der Primary-Key also zaubert mir meine Prozedur folgende SQL-Anweisung:
SELECT CONVERT(VARCHAR, ID) + '-' + CONVERT(VARCHAR, Datum) FROM ?tabelle? soweit so gut. Mein eigentliches Problem ist nun aber leider, dass ich in einem Trigger die Tabellen inserted und deleted auswerten muss, damit ich nur die geänderten Zeilen verarbeite.
Da ich aber mein SQL-Statement als String vorliegen habe, muss ich es mit
EXEC sp_executesql @SQLString, N'' ausführen.

Das klappt im Prinzip ja auch, nur wenn ich bei der ?tabelle? eben inserted oder deleted benutzen möchte, dann geht das nicht. Diese Tabellen sind nur im Trigger vorhanden und mein SQLString wird nun in einer anderen Session ausgeführt. Eine Bindung über sp_getbindtoken und sp_bindsession habe ich auch schon versucht. Das klappt aber nicht, weil gar keine Transaction läuft. Es ist ja nur ein Trigger.

So, hoffe es war jetzt nicht so langatmig.
Hoffe, mir kann geholfen werden. Viellicht sehe ich ja den Wald vor lauter Bäumen nicht mehr.
Bin auch offen für eine andere Lösung.

MfG
Thorsten
  Mit Zitat antworten Zitat