Tossi65 1 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 Guten Morgen, ich warte mehrere alte Datenbanken und soll eine Datenabgleich erstellen. Ich kenne die Urheber nicht persönlich, aber dafür deren Fehler. In den Datenbanken gibt es Tabellen, welche einen zusammengesetzten Primary Key besitzen, aber keine eigene eindeutige Identspalte. Wenn ich also einen Datensatz suche finde ich diesen mit dem prim Key. Aber wenn ich die Daten abgleichen soll wird es schwierig. Ich könnte natürlich eine Tabellenscan durch führen, aber nach welcher Spalte soll ich die Daten sortieren. Die Tabellen haben teilweise mehrere Mio. Datensätze. Deshalb lese ich immer 1000 Datensätze ein , vergleiche und wieder 10 Datensätze. Wenn ich das nicht mache, dauert es nicht lang und der Arbeitsspeicher ist am Ende. Nun meine Frage: Ich komme aus der FireBird Welt und da haben die Tabellen von der DBEngine interne Tabellenspalten, z. B. "rdb$Key". Darin ist eine eindeutiger Index den man auch nutzen kann. Gibt es so etwas auch im SQL Server. Gruß Torsten Zitieren Link zu diesem Kommentar
q617 1 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 Dies ist ein Admin-Forum, kein Entwicklerforum. Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 Hast du einmal Beispieldaten? Ich kann mir hier nichts vorstellen. Der Primary Key ist doch die Identität. Zitieren Link zu diesem Kommentar
chrismue 96 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 (bearbeitet) vor 28 Minuten schrieb q617: Dies ist ein Admin-Forum, kein Entwicklerforum. @q617 Schon mal geschaut, in welchem Unterforum wir uns befinden? Gruß chrismue bearbeitet 26. Juli 2023 von chrismue Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 Moin, du hast es hier mit einem "Composite Primary Key" zu tun. Das ist zulässig, hat aber - wie du siehst - seine Nachteile. Um diese Nachteile aufzulösen, musst du das Datenmodell genau kennen und auch wissen, wie auf die Daten zugegriffen wird. Einfach so ändern kannst du das nicht, weil du damit die Grundlogik der Tabelle änderst. Heißt für dich also: Entweder den ursprünglichen Entwickler ansprechen oder viel Arbeit in die Analyse stecken. https://learn.microsoft.com/en-us/sql/relational-databases/tables/create-primary-keys?view=sql-server-ver16 Wenn du beides nicht tun kannst oder willst, müsstest du versuchen, deine Methode zum "Datenabgleich" zu optimieren (was auch immer darunter zu verstehen ist). Leider kann man an der Stelle wohl nicht viel mehr sagen, ohne viel Aufwand in die Problemanalyse zu stecken. Gruß, Nils Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 Tabellen mit mehr als einem Primärschlüssel findet man vielleicht nicht häufig, sind aber durchaus üblich, z.B. dann wenn eine Tabelle historisierende Daten enthält. Dann bilden z.B. Änderungsdatum und ein fachlicher Wert den Primärschlüssel. Aber wie Nils schon schrieb: Ohne Dokumentation des Datenmodells wird es schwierig. Zitieren Link zu diesem Kommentar
MDD 12 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 (bearbeitet) Hallo. Ganz verstehe ich das Anliegen nicht. Für mich fehlen die Rahmbedingungen. Kannst du von einer Datenbank direkt auf die andere zugreifen? Was ist der Zweck des Datenabgleichs? Von wo nach wo gehen Daten? Transportierst du 1 Record von A nach B oder checkst du ob sich einzelne Werte in einem Record geändert haben und übergibst nur diese? Eindeutige Indexe und Primary Key sind generell ja nicht das selbe. Eindeutige Indexe kannst du ja viele haben, unabhängig wie sie aufgebaut sind. Gruß MDD bearbeitet 26. Juli 2023 von MDD Fehler korrigiert Zitieren Link zu diesem Kommentar
Tossi65 1 Geschrieben 26. Juli 2023 Autor Melden Teilen Geschrieben 26. Juli 2023 Hallo an alle, ich gebe euch allen Recht. Aber mir hat man beim Designen einer Tabelle bei gebracht, das eine Tabelle eine eineindeutige Spalte haben sollte(ID, Lfdnr,...). Meist sogar als AutoGenerate für die fortlaufende Nummer. Diese hat nicht unbedingt etwas mit dem prim Key zu tun. Über diese eindeutige ID kann ich den Datensatz direkt ansprechen oder als Offset für Abfragen benutzen. Wenn ich diese Spalte nicht habe wie soll ich folgendes realisieren: "Select Top 1000 * from tabelle where lfdNr > x". Das geht nicht,leider. Der Primary Key besteht aus mehreren Fremdschlüsseln, einer eindeutigen Länderkennung und wird so eindeutig eindeutig. Die Tabellen sind auf mehreren Datenbank-Servern global verteilt. Der zusammengesetzte Prim. Key soll ein zusammenführen der Daten in eine Tabelle ermöglichen (Zentral). Das heisst die Fremdschlüssen werden in der Zentraltabelle mehrfach vorkommen bis auf die Länderkennung! Also Replikation nachgebildet. Die Entwickler sind in Rente oder nicht mehr da. Das ganze ist natürlich historisch entstanden. Das ich jetzt an den Datenbanken kaum etwas machen kann ist mir klar. Aber ich soll das Verteilen und Zusammenbringen der Daten ermöglichen. Mir ist klar, das diese Tabellen eigentlich nur mit einem kompletten Scan von 0 bis n über den prim. Key von der Quelle zum Ziel abzugleichen sind. Wie gesagt mehrere Mio. Datensätze pro Datenbank. Bei den restlichen Tabellen schaue ich einfach auf die max Lfdnr einer Tabelle im Ziel und dann in der Quelle. Daraus ergibt sich der Gap und wird übertragen. Ich hoffe es ist jetzt etwas deutlicher.Noch einmal die Frage: Gibt es von der DBEngine interne Datensaplten die man benutzen könnte? Vielen Dank Torsten Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 (bearbeitet) Wie geschrieben: Tabellen müssen nicht zwangsläufig eine INT-Spalte haben, die dann hochzählt. MS arbeitet auch gern mit GUID's. Wenn sich ein eindeutiger Datensatz nur mit mehreren Spalte bilden lässt, musst Du die eben im Join oder im Where adressieren. Ohne DB-Schema kaum möglich. bearbeitet 26. Juli 2023 von zahni Zitieren Link zu diesem Kommentar
MDD 12 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 Datenabgleich heißt für mich auch Änderungen zu übernehmen, also auch Löschungen und Korrekturen. Da wirst dir mit einer fortlaufenden Nummer schwer tun, außer die du legst für jeden Änderung einen neuen Datensatz an. Hast vielleicht ein Änderungsdatum im Datensatz oder eine Tabelle die Änderungen mitloggt? Zitieren Link zu diesem Kommentar
Tossi65 1 Geschrieben 26. Juli 2023 Autor Melden Teilen Geschrieben 26. Juli 2023 @MDD Das habe ich mir mit einem Trigger geholfen. Bei Insert , Update und Delete schreibt der Trigger mir die verwendeten Felder des Schlüssels mit Werten und die Aktion in eine Tabelle. Eine Datumsspalte gibt es nicht. Es sind einfach Verknüpfungstabellen mit einer "n zu m Beziehung". Vielleicht ist der Trigger die einzige Lösung. Gefällt mir aber nicht. Danke Torsten Zitieren Link zu diesem Kommentar
MDD 12 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 vor 1 Minute schrieb Tossi65: Bei Insert , Update und Delete schreibt der Trigger mir die verwendeten Felder des Schlüssels mit Werten und die Aktion in eine Tabelle. Und was hindert dich daran dich an dieser Tabelle zu orientieren um deinen Datenabgleich vorzunehmen? Wenn du da einen laufende Nummer oder einen Zeitstempel mitschreibst hast du doch was du brauchst? Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 Moin, ich glaube nicht, dass diese Diskussion weit führt, wenn wir weder das Datenmodell noch die Anforderungen kennen. Gruß, Nils 2 Zitieren Link zu diesem Kommentar
Tossi65 1 Geschrieben 26. Juli 2023 Autor Melden Teilen Geschrieben 26. Juli 2023 @NilsK Ich gebe dir recht ohne Datenmodell ist schlecht. Aber ich werde es jetzt mit dem Trigger versuchen. Danke für Eure Unterstützung. Gruß Torsten Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 26. Juli 2023 Melden Teilen Geschrieben 26. Juli 2023 Moin, und es ist eben schlecht, um Hilfe zu fragen, wenn man nicht angibt, was man eigentlich erreichen will. Für's nächste Mal dann ... Gruß, Nils Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.