AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL - Spalten -> Spalte (ohne die Spalten zukennen)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von omata · begonnen am 18. Sep 2005 · letzter Beitrag vom 18. Sep 2005
Antwort Antwort
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, 11: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
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

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

  Alt 18. Sep 2005, 12:34
Hallo Thorsten,

du schreibst gar nichts über die Randbedingungen, die dich zur Wahl deines Lösungsansatzes getrieben haben. Warum kannst du den Abgleich der Daten nicht über Replikation lösen?

Zitat von omata:
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).
Hast du dich verschrieben oder möchtest du auch Änderungen an den Metadaten nachführen?

Zu deiner SP / Trigger Problematik: Microsoft empfiehlt den Einsatz von CAST anstelle von CONVERT wo immer möglich. Und für den Zugriff auf Informationen der Pseudo Tabellen aus einer SP heraus, vielleicht kannst du die relevanten Daten ja als Parameter an die SP übergeben?

Grüße vom marabu
  Mit Zitat antworten Zitat
omata

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

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

  Alt 18. Sep 2005, 15:21
Zitat von marabu:
du schreibst gar nichts über die Randbedingungen, die dich zur Wahl deines Lösungsansatzes getrieben haben. Warum kannst du den Abgleich der Daten nicht über Replikation lösen?
naja, ich wollte meinen Beitrag nicht noch länger werden lassen.
Also, es geht darum, dass man eine öffentliche und eine im prinip nicht-öffentliche DB hat. Zwischen beiden sitzt eine Firewall, die nur Verbindungen von nicht-öffentlich zu öffentlich zulässt (und nur einen Port). Es müssen aber auch Daten von der öffentlichen Seite zur Nicht-öffentlichen gehen.
Das heisst, dass Tool mit dem der Server auf der nicht-öffentlichen Seite eine Verbindung aufbaut, macht einen Abgleich in beide Richtigen, wobei vom nicht-öffentlichen Server mehr rübergeschoben wird, der Weg von öffentlich nach nicht-öffentlich ist aus Sicherheitsgründen auf eine Tabelle begrenzt.

Da dieses Ausgleichen sehr oft (sagen wir mal alle 10 Minuten) passieren soll, kann ich es nicht über Replikation machen. Für die Replikation muss man exklusiven Zugriff auf alle Tabellen haben, da nun aber gerade jemand auf der Homepage ist und irgendwas einträgt (in diese eine Tabelle, die von aussen nach innen geht), würde das dann nicht gehen - oder doch?
Ausserdem, ist die DB jetzt ~300MB gross, dass heisst die Übertragung alle 10 Minuten finde ich da nicht so sinnvoll, oder verstehe ich das jetzt falsch?
Und noch ein dritter Punkt spricht für mich dagegen, was ist mit der Verbindung von aussen nach innen, diese Verbindungart gibt es nicht (Firewall).
Bitte korrigire mich, wenn ich das falsch sehe.

Zitat von marabu:
Zitat von omata:
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).
Hast du dich verschrieben oder möchtest du auch Änderungen an den Metadaten nachführen?
Sorry, was verstehst du unter Metadaten? Den Aufbau der Tabellen in der DB? Wenn ja, dann meine ich genau das. Unsere DB muss ständig erweitert oder auch umgebaut werden. Glücklich bin ich darüber natürlich nicht, aber was soll ich machen. Die Anforderungen drehen sich manchmal bis zu 180°

<EDIT>
oh, ich glaube jetzt verstehe ich was du meinst.
Ob sich was an den Primary-Key-Verbindungen ändert. Natürlich nicht! es kommen eventuell nur neue Felder hinzu. Danke, dass war schonmal der erste Knoten der sich gelöst hat. Dieses Problem übernimmt ja das Delphiprogramm. In der Änderungtabelle steht ja nur drin in welcher Tabelle sich welche Zeile wie verändert hat. Und dort wird nur der Primary-Key-Inhalt gespeichert - und der wird gleich bleiben.
</EDIT>

Zitat von marabu:
Zu deiner SP / Trigger Problematik: Microsoft empfiehlt den Einsatz von CAST anstelle von CONVERT wo immer möglich. Und für den Zugriff auf Informationen der Pseudo Tabellen aus einer SP heraus, vielleicht kannst du die relevanten Daten ja als Parameter an die SP übergeben?
Ja, ok. Ob nun CAST oder CONVERT ist hierbei, denke ich, erstmal egal. Aber trotzdem danke für den Hinweis. Und wo du das gerade ansprichst, warum eigentlich?

Trotzdem, vielen Dank marabu, dass du dich meinem Problem annimmst und versuchst mir zuhelfen...
Thorsten
  Mit Zitat antworten Zitat
omata

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

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

  Alt 18. Sep 2005, 20:12
So, habe das Problem selber gelöst.

Das Zauberwort heisst Globale Temporäre Tabelle (##)

MfG
Thorsten
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz