Ich entwickle eine Rails 3 App, die Postgres als Datenbank verwendet. Ich habe die folgende Tabelle:
%Vor%Dies hat zwei Spalten:
Wenn ich jetzt versuche, eine Zeile mit einem Duplikat some_other_id
einzufügen, scheitert es (gut) und ich bekomme die folgende Ausgabe in meinen Postgres-Logs:
%Vor%
Das Problem ist, dass es völlig normal ist, dass meine App die selbe ID zweimal hinzufügt, und meine Logs werden mit dieser Fehlermeldung "ERROR" gespammt, was verschiedene Probleme verursacht: Dateien nehmen viel Festplattenplatz ein, Diagnose bekommt verloren im Lärm, muss Postgres diags wegwerfen, um die Protokolldateien innerhalb der Größengrenzen usw. zu behalten.
Weiß jemand wie ich das kann?
INSERT
. INSERT
. Ich habe von Regeln und Auslösern gehört, aber ich kann nicht arbeiten (obwohl ich kein Postgres-Experte bin). Beachten Sie, dass jede Lösung mit Rails arbeiten muss, die ihre Einfügungen wie folgt ausführt:
%Vor%Um den doppelten Schlüsselfehler zu vermeiden:
%Vor%Ich gehe davon aus, dass id eine serielle Spalte ist, die ihren Wert automatisch erhält.
Dies unterliegt einer sehr kleinen Wettlaufsituation (im Zeitfenster zwischen SELECT
und INSERT
). Aber das Schlimmste, was passieren kann, ist, dass Sie schließlich einen doppelten Schlüsselfehler bekommen und dies wird kaum jemals auftreten und sollte in Ihrem Fall kein Problem sein.
Sie können immer Raw-SQL verwenden, wenn Ihr Framework die Verwendung der richtigen Syntax einschränkt.
Oder Sie können eine UDF (benutzerdefinierte Funktion) für den Zweck erstellen:
%Vor%Anruf:
%Vor% Oder als Vorgabe für ein bereits vorhandenes id
:
Auch hier bleibt eine minimale Chance für eine Race Condition. Sie können dies auf Kosten einer langsameren Leistung beseitigen:
Sie können die Protokollierung von Fehlermeldungen für die Sitzung (oder global tatsächlich) deaktivieren, aber es erfordert Superuser-Privilegien:
Durch Ausführen:
%Vor% Nur fatale Fehler werden protokolliert, bis die Sitzung (= Verbindung) beendet wird oder Sie eine neue set
-Anweisung ausgeben, um den Wert zurückzusetzen.
Da jedoch nur ein Superuser dies ändern darf, ist dies wahrscheinlich keine gute Lösung, da Ihr Anwendungsbenutzer dieses Privileg haben müsste, was ein großes Sicherheitsproblem darstellt.
Tags und Links sql ruby-on-rails postgresql duplicates sql-insert