COPY in verbindung mit PRIMARY KEY

Hallo

ich habe vor ein c-Programm zu schreiben das den Datenbestand sichert und ein 2. Programm das den Datenbestand in der Datenbank wiederherstellt.

So ich wollte dafür den Befehl COPY verwenden. COPY TO ging soweit über Konsole.
Nun habe ich ein Problem beim einspielen der Daten mit COPY FROM in die Datenbank.
Und zwar folgender Fehler

testdb=# COPY t_test FROM '/root/testing2' WITH DELIMITER AS ';';ERROR:  duplicate key violates unique constraint "t_test_pkey"
CONTEXT:  COPY t_test, line 1: "uetfdifudfk;2344;4564;3;2003-05-07;2"

Soweit ich das verstehe hat der nen Problem mit dem Primärschlüssel der Tabelle, der schon vorhanden ist. Ohne Primärschlüssel scheint COPY die Daten einfach zu überschreiben. Ist dies auch mit Primärschlüssel möglich?? Gibt es ne Option die man für einfachen überschreiben angeben kann oder dass dieser ignoriert wird.

Es sei dazu gesagt, die IDs sind eindeutig, sowie die Datensätze, d.h., ist die ID in der DB gleich der ID der einzuspielenden Daen, ist der rest des Datensatzes auch gleich. Eine gelöschte ID wird nicht erneut angelegt. Die ID ist nen SERIAL-Typ. (AUTO_INCREMENT)


Beispiel
Ich lösche versehendlich einen Datensatz. Mit dem C-Programm will ich den Wiederherstellen. Mittels COPY soll der Datensatz wieder in die Datenbank eingepflegt werden. Gleichzeitig soll es auch möglich sein alle Datensätze wieder herzustellen, wenn diese verloren gegangen sind.

kann wer helfen??

danke im voraus!!!

COPY hängt an. Wenn es mit dem PK kracht, dann kracht es halt. Abhilfe wäre, in eine leere Tabelle zu kopieren und aus dieser mittels SQL die Datensätze in die Zieltabelle zu INSERTen, die dort noch fehlen. Das zu ermitteln, ist simpel.

Andreas

Magst du nicht einfach pg_dump/pg_restore aufrufen?

Man muss das Rad ja nicht noch mal erfinden.

Danke euch erstmal für die Antworten :slight_smile:

OK das mit der leeren Tabelle wäre ne Möglichkeit, kann ich ja mal ausprobieren.

pg_dump hab ich schon verwendet. Aber damit kann ich keine weitern Funktionen realisieren. Eventuell hab ich vor die Backups zu automatisieren, d.h., im bestimmten Zeitintervall soll ein Backup erstellt werden und in ein Verzeichnis system einsortiert werden. Zu dem kann noch eine Verschlüsselung und Signatur folgen, wegen rechtliche Geschichten. Beim Restore soll ein weiteres c-programm entworfen werden. Die Rechte dafür soll nur ein Nutzer erhalten.

dann hab ich auch noch etwas im Handbuch von postgresql gefunden.

pg_dump (und als Konsequenz auch pg_dumpall) hat ein paar Beschränkungen, welche daher rühren,
dass es schwierig ist, bestimmte Informationen aus den Systemkatalogen wieder zusammenzusetzen.
Insbesondere ist die Reihenfolge, in der pg_dump die Objekte ausgibt, nicht sonderlich intelligent. Das
kann zum Beispiel zu Problemen führen, wenn Funktionen in Spaltenvorgabewerten verwendet werden.
Die einzige Lösung ist, den Dump von Hand richtig zu sortieren. Wenn Sie zwischen Objekten gegensei-
tige Abhängigkeiten erzeugt haben, wird noch mehr Arbeit auf Sie zukommen.

Da ich den orginalzustand bewahren will und ich noch nicht absehen kann wie umfangreich die DB noch werden kann, denke ich ist es ratsam vorzubeugen und pg_dump nicht zu verwenden.

Du könntest auch einen Marker anfügen, der dir ‘gelöschte’ rows markiert. Das erspart Ärger mit den Keys und erleichtert das wiederherstellen von versehentlich ‘gelöschtem’. Ansonsten würde ich mich auch auf die vorhandenen Backuptools verlassen.

Gruß Uwe

Das war ganz sicher ein altes Handbuch.

Andreas

Wieso sollte sich das alles über ein Script, nicht automatisieren lassen?

Gruß Uwe

Also ganz ehrlich: alles, was du in einem C-Programm realisieren kannst, kriegst du auch mit pg_dump hin. Das Zitat von dir bezieht sich auf die Tatsache, dass man a) wenn man nur einzelne Tabellen dumpt, unter Umständen später Probleme hat und b) ältere Versionen ab und zu Probleme mit der Reihenfolge von Tabellen hatten. Das ist mittlerweile alles korrigiert, aber du müsstest trotzdem das Rad neu erfinden.

Und speziell für Verschlüsselung und Signatur: hier würde ich auf gar keinen Fall das Rad neu erfinden wollen, dafür kann man zuviel falsch machen. Lass pg_dump den Dump in eine temporäre Datei spielen, nimm die Datei und verschlüssele diese hinterher, dann wipe das Original. Alternativ lass die Ausgabe nach stdout pipen und greife diesen Output direkt ab, um das zu verschlüsseln.

Deine Rechtevergabe kannst du immer noch über die Tatsache regeln, wer dein C-Programm aufrufen kann.

Verschlüsselung wollt ich eh dann nen bereits vorhandenes Programm nehmen … ich hab mich danit noch nicht auseinander gesetzt.

Nen C-Programm soll es werden, da es noch mehr Anforderungen noch dazukommen.
Aber das mit dem Marker ist nicht schlecht. Werde ich dann mal schaun, wie ich das umsetzt. Im moment muss ich erstmal an ner anderen stelle weiter machen.

danke euch erstmal.