Jump to content

SQL Server Datenbank Tabelle fehlende Identitätsspalte


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

 

Link zu diesem Kommentar

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

 

Link zu diesem Kommentar

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 von MDD
Fehler korrigiert
Link zu diesem Kommentar

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

Link zu diesem Kommentar

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 von zahni
Link zu diesem Kommentar

@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

Link zu diesem Kommentar
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. 

 

:eye2:

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?

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...