![]() |
Zwei SQL-Datenbanken abgleichen, WIE?
Hallo,
ich habe eine Verständnisfrage: Ich habe einen SQLServer. Auf diesem Server liegen zwei Datenbanken. Datenbank 1 (Name: Cobra) hat eine Tabelle Adressen, Datenbank zwei (Name: Winline) hat eine Tabelle Kunden. Beide Tabellen haben eine Schnittmenge von Feldern die ich abgleichen möchte. Beispiel: Schaue dir alle Datensätze in der Tabelle Adressen in der Datenbank Cobra an, die in den letzten 10 Minuten geändert wurden (Zeitstempel). Als Ergebnis habe ich eine Liste von Datensätzen, diese müssen nun in die Tabelle Kunden in den entsprechenden Datensatz (wenn vorhanden) oder neu angelegt werden. Ich arbeite mit ADO. Brauche ich zwei ADOConnection ? Wie kann ich die Tabellen bei zwei unterschiedlichen SQL-Datenbanken abgleichen, bzw. drauf zugreifen. Ich brauche irgendwie einen Denkanstoss. Danke |
Re: Zwei SQL-Datenbanken abgleichen, WIE?
Hi
Geht das nicht mit der SQL-Anweisung UNION ? Ausserdem denke ich beim Ausdruck Schnittmenge an Redunanzen. Musst Du die Daten ableichen oder lässt sich das auch mit einer Verknüpfung lösen? Für zwei Datenbanken brauchst Du auch zwei ADOConnections. Gruss Armin |
Re: Zwei SQL-Datenbanken abgleichen, WIE?
Zitat:
Da die Infos etwas spärlich sind, nehme ich für mein Beispiel an, dass die Spalten A & B eindeutig sein müssen (zum Bleistift Vorname & Nachname), möglicherweise reicht dir auch eine Art Kundennummer. :gruebel:
SQL-Code:
Beispiel:
SELECT Decode(k.A
,NULL ,1 /* kein Wert in Kunden -> INSERT */ ,2) DmlType /* andernfalls -> UPDATE */ ,Decode(k.A /* Der PK wird nur für's UPDATE gebraucht ;) */ ,NULL ,-1 ,k.PK) PK ,sQ.A ,sQ.B ,sQ.C FROM (SELECT A, B, C FROM WinLine MINUS SELECT A, B, C /* alle Datensätze aus WinLine, */ FROM Kunden) sQ /* die so nicht in Kunden enthalten sind */ LEFT JOIN Kunden k ON k.A = sQ.A and /* deshalb Eindeutigkeit von A & B ;) */ k.B = sQ.B UNION ALL SELECT 3 DmlType /* alle Datensätze aus Kunden, */ ,k.PK /* die in WinLine nicht mehr da sind */ ,k.A /* -> löschen */ ,k.B ,k.C FROM Kunden k WHERE not EXISTS (SELECT IrgendWas FROM WinLine WHERE k.A = sQ.A and k.B = sQ.B)
Zitat:
Zitat:
Da ich absolut null (naja vielleicht 0,01 :mrgreen: ) Ahnung vom SQL Svr habe muss ich jetzt mal fragen: Kann der SQL Svr DB-Links?
Wirklich Licht ins Dunkel wird wohl nur ein Profi für den SQL Svr sein. (Um die Zeit dürfte sich Leusel durch die DP schleichen. :zwinker: ) p.s.: Hui, war vielleicht etwas zuviel des Guten.... :gruebel: |
Re: Zwei SQL-Datenbanken abgleichen, WIE?
Erstmal vielen Dank für die ausführlichen Infos.
Ich möchte mein Problem (Herausforderung) genauer beschreiben: Es gibt zwei Programme: Cobra (Adress Plus), eine Adresssammlung + CRM. Winline, eine Warenwirtschaft. Beide arbeiten mit den SQL-Server, beide sind unabhängig, daher hat jeder seine eigene SQL-DB. Cobra bsp. Cobra01. In der Datenbank Cobra01 gibt es die Tabelle Addresses. In dieser Tabelle werden die Adressstammdaten gepflegt. So weit so gut. Die Winline hat auch eine eigene DB bsp. Winline01. In dieser DB gibt es eine Tabelle Debitoren o. Kunden. Hier werden die Stammdaten der Kunden gepflegt. Nun möchte ich eine (einseitige) Schnittstelle realisieren, die anhand von Filterkriterien die Tabelle Addresses der Cobra filtert, und diese Filtermenge für einen Abgleich mit der Tabelle Kunden in der Winline nutzt. Praktisch arbeitet man in der Adressdatenbank, irgendwann deklariert man eine Adresse als Kunden, dann muss diese an die Winline übergeben werden. Wobei unterschieden werden muss, ob der Datensatz in der Winline schon vorhanden ist, oder neu angelegt werden muss. Die SQL-Statements sind keine Probleme. Nur irgendwie fehlt mir die Info wie ich von der einen DB in die andere Daten schaufelt kann...?!?! Gruss Marco |
Re: Zwei SQL-Datenbanken abgleichen, WIE?
Um welchen SQL Server handelt es sich?
Wenn MS SQL Server kannst du Tabellen nach folgendem Schema ansprechen: <Datenbankname>.<DatenbankOwner>.<Tabellenname>. Beispiel: Datenbankname=Test, DatenbankOwner=Standard, Tabelle=Adresse => Test.dbo.Adresse Grüße Mikhal |
Re: Zwei SQL-Datenbanken abgleichen, WIE?
Hi,
schau mal ob dir das weiter hilft. Gibt sicher noch weitaus elegantere Methoden, habe aber grad wenig zeit. need: 2 adoconnection, 2 adodateset (zum ansehen 2 datasources und 2 grids), 1 adocommand bei adodateset1 kannste deine abfrage nach Änderungen(Zeitstempel) machen brauchst natürlich eine Eindeutigkeit(Kunden-NR oder so) - hier mal "Name" sonst wird mehr geupdated als erforderlich. Insert hab ich jetzt mal weggelassen, das kannste ggf. selber einbauen. ------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var i,b:integer; begin ADODataSet1.FindFirst; for i:=0 to ADODataSet1.RecordCount-1 do begin ADODataSet2.FindFirst; for b:=0 to ADODataSet2.RecordCount-1 do begin if ADODataSet2.fieldvalues['NAME']=ADODataSet1.fieldvalues['NAME'] then begin ADOCommand1.CommandText:='update testvar_tbl set ort='+ quotedstr(ADODataSet1.fieldvalues['ORT']) +' where name='+ quotedstr(ADODataSet1.fieldvalues['NAME']); ADOCommand1.Execute; end; if b<ADODataSet2.RecordCount-1 then ADODataSet2.FindNext; end; if i<ADODataSet1.RecordCount-1 then ADODataSet1.FindNext; end; end; ----------------------------------------------------------------------------------- Am Besten du gibst mal noch an wie all die Spalten in den Tabellen heißen, dann kann ma da was Konkretes posten. gruss marcel |
Re: Zwei SQL-Datenbanken abgleichen, WIE?
Vielen Dank,
ich versuche es heute abend mal.... gruss marco |
Re: Zwei SQL-Datenbanken abgleichen, WIE?
Wäre es nicht so möglich?
Von Lösungen á la Daten in eine Delphi App holen, irgendwas damit machen und dann wieder zurückschieben halte überhaupt nichts. Wenn man so seine Probleme löst, kann man sich gleich mySQL zulegen, eine halbwegs "intelligente" DB wie der SQL Svr wäre dann sinnlos. BTW: Wer seine Problemlösungen nicht in reinem SQL oder der Script-Sprache der DB formulieren kann, sollte sein DB-Design überdenken. ;) Wie immer: Als ohne Gewehr, bin halt kein SQL Svr'ler ;) Leusel??? :roll: |
Re: Zwei SQL-Datenbanken abgleichen, WIE?
Sorry, dass ich mich jetzt noch hierzu äußere, aber hab so n ähnliches Problem! :(
Und zwar soll bei mir ebenfalls ein Abgleich von bestimmten Daten stattfinden. Dies jedoch zwischen einem Sybase Server und einem MS SQL Server. Außerdem soll es ständig zur Laufzeit passieren (beispielsweise, wenn in der Sybase DB ein neuer Kunde angelegt wird, soll dieser in die DB auf dem MS SQL Server übernommen werden - jedoch nur, wenn noch nicht vorhanden!). Mir fehlt im Moment noch völlig die Idee! Bin neu im DB Bereich. Kann mir jemand helfen? :?: Grüßle, Klarabella |
Re: Zwei SQL-Datenbanken abgleichen, WIE?
Hi,
Zitat:
da mußt du dich mal belesen, ob es für Sybase bzw. MYSQL möglich ist, Trigger zu erstellen wie bei Oracle. Ich glaube aber schon, auch wenn nicht so umfangreich. Mit so einem Trigger kann auf Ereignisse reagiert werden, z.b update oder insert einer Tabelle. Bei dem Trigger selbst können Funktionen, Packages oder direkt SQl-Code aufgerufen werden, welche dann z.b. Updates auf eine andere DB ausführen. Mußt natürlich einen Database-Link erstellen auf der DB, die den Zugriff machen soll. In deinem Fall Sybase. Ob und wie das bei Sybase geht und vor allem im Zusammenspiel mit MYSQL must du dich mal noch weiter informieren. gruss marcel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz