Frage

Ist es möglich, Löschen der ersten Zeile in der Tabelle auf Seite PostgreSQL zu verhindern?

Ich habe eine Kategorie Tisch und ich möchte Löschung der Standardkategorie verhindern, wie es die Anwendung brechen könnte. Natürlich konnte ich es in Anwendungscode leicht tun, aber es wäre viel besser, es in der Datenbank zu tun.

Ich denke, es hat etwas mit Regeln für die DELETE-Anweisung zu tun, aber ich konnte nicht etwas aus der Ferne nah an mein Problem in der Dokumentation finden.

War es hilfreich?

Lösung

Der beste Weg, ich sehe dies zu tun ist durch einen DELETE-Trigger für diese Tabelle zu erstellen. Grundsätzlich finden Sie eine gespeicherte Prozedur schreiben, müssen sicherstellen, dass diese ‚Standard‘ Kategorie wird es immer geben, und dann erzwingt es einen Trigger ON DELETE Ereignis auf dieser Tabelle. Ein guter Weg, dies zu tun, ist ein Trigger-pro-Zeile erstellen, die auf DELETE Ereignisse der ‚default‘ Kategorie Zeile wird nie gelöscht werden.

garantieren

Bitte beachten Sie auch PostgreSQL Dokumentation über Trigger und Stored Procedures:

http://www.postgresql.org/docs/8.3 /interactive/trigger-definition.html

http://www.postgresql.org/docs/8.3/interactive /plpgsql.html

Es gibt auch wertvolle Beispiele in diesem Wiki:

http://wiki.postgresql.org/wiki/A_Brief_Real-world_Trigger_Example

Andere Tipps

Sie hatten Recht über das Denken des Regelsystemes. Hier ist ein Link zu einem Beispiel für Ihr Problem. Es ist sogar einfacher als die Auslöser:

create rule protect_first_entry_update as
  on update to your_table
  where old.id = your_id
  do instead nothing;
create rule protect_first_entry_delete as
  on delete to your_table
  where old.id = your_id
  do instead nothing;

Einige Antworten vermissen einen Punkt: auch die Aktualisierung der geschützten Zeile beschränkt werden muss. Ansonsten kann man zunächst die geschützte Zeile so aktualisieren, dass sie nicht mehr von dem verbotenen Löschkriterium erfüllt, und dann kann man die aktualisierte Zeile löschen, da es nicht mehr geschützt ist.

Sie möchten einen BEFORE DELETE auf dem Tisch auslösen . Wenn Sie die Zeile zu löschen versuchen (entweder Spiel von PK oder einen separaten haben „schützen“ boolean Spalte), RAISE eine Ausnahme aus.

Ich bin nicht vertraut mit PostgreSQL-Syntax, aber es sieht aus wie das ist, wie Sie es tun würde:

CREATE FUNCTION check_del_cat() RETURNS trigger AS $check_del_cat$
    BEGIN            
        IF OLD.ID = 1 /*substitute primary key value for your row*/ THEN
            RAISE EXCEPTION 'cannot delete default category';
        END IF;

    END;
$check_del_cat$ LANGUAGE plpgsql;

CREATE TRIGGER check_del_cat BEFORE DELETE ON categories /*table name*/
    FOR EACH ROW EXECUTE PROCEDURE check_del_cat();

Sie können eine Zeile in einer anderen Tabelle (so genannte Standardwerte) haben Referenzierung der Standardkategorie. Die Einschränkung FK wäre nicht das Löschen der Standardkategorie geschehen lassen.

Beachten Sie, wie die Arbeit auslöst. Sie werden für jede Zeile abfeuern Ihre delete-Anweisung gelöscht werden. Dies bedeutet nicht, Sie löst nicht nur dies im Auge behalten verwenden sollte und vor allem Ihre Nutzungsszenarien testen und sicherstellen, dass die Leistung die Anforderungen entspricht.

Soll ich eine Regel oder einen Trigger?

Von den offiziellen Dokumenten: „Für die Dinge, die von beiden implementiert werden können, die am besten geeignet ist, hängt von der Nutzung der Datenbank. Ein Auslöser für jede betroffene Zeile einmal gebrannt wird. Eine Regel die Abfrage manipuliert oder erzeugt eine zusätzliche Abfrage. Also, wenn viele Zeilen betroffen sind in eine Erklärung, in der Regel einen zusätzlichen Befehl ausgeben wird wahrscheinlich schneller sein als ein Auslöser, der für jede einzelne Zeile aufgerufen und muss seine Operationen oft ausgeführt werden. Allerdings ist der Trigger-Ansatz konzeptionell weit einfacher als die Regel Ansatz ist, und ist leichter Neulinge richtig zu machen. "

Lesen Sie die Dokumentation für weitere Details.
http://www.postgresql.org/docs/8.3/interactive/ Regeln triggers.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top