Seite 1 von 1

UPDATE verhindern

Verfasst: Do 30. Nov 2017, 18:32
von ulrich
Hallo,
in einem Workflow möchte ich fehlerhafte Eingaben der Benutzer erschweren, wenn die Arbeit an einem Datensatz (row) in einer Tabelle abgeschlossen ist.
Das stelle ich mir etwa so vor:

Code: Alles auswählen

create table tbl_a (
  id serial primary key,
  gesperrt boolean not null,
  ...);
create table tbl_b (
  id serial primary key,
  a_id integer references tbl_a(id),
  ...);
Wird in tbl_a für einen Datensatz (row) gesperrt=TRUE gesetzt, soll
  1. für diesen Datensatz UPDATE nur noch für gesperrt möglich sein (damit man die Sperre nötigenfalls auch wieder aufheben kann) und
  2. in tbl_b sollen keine Datensätze erfasst (INSERT), gelöscht (DELETE) oder geändert (UPDATE) werden können, die auf diesen Datensatz in tbl_a verweisen.
So möchte ich erreichen, dass man den Datensatz sozusagen erst wieder entsperren muss, bevor weitere Änderungen möglich sind.
Geht das über Constraints? Oder muss man das in einem Trigger oder so programmieren? Oder eine andere Möglichkeit?
Mit Dank und Gruß
Ulrich

Re: UPDATE verhindern

Verfasst: Do 30. Nov 2017, 18:49
von Gisman
Ich würde hier Rules oder Trigger verwenden.

Gruß Uwe

Re: UPDATE verhindern

Verfasst: Do 30. Nov 2017, 19:49
von akretschmer
Über Constraints wird das nicht gehen. Rules sind etwas in Verruf gekommen. Bleiben also eigentlich nur noch TRIGGER auf tbl_b, wie auch mein geschätzter Freund @gisman schon sagte.


Grüße auch aus Bonn. Also jetzt grad in Bonn, sonst eher selten hier ... aber eine schöne Stadt, bin gern hier.

Re: UPDATE verhindern

Verfasst: Fr 1. Dez 2017, 11:34
von Gisman
Herzlichen Dank für das Kompliment, @akretschmer, aber aus welchem Grund sind Rules in Verruf geraten? Ich nutze das hier z.B. um eben ein Update zu einem Insert umzubiegen, damit ich eine Art Versionierung auf Row-Ebene herstellen kann. Nur so aus Interesse.
Viele Grüße
Uwe

Re: UPDATE verhindern

Verfasst: Fr 1. Dez 2017, 12:43
von castorp
Gisman hat geschrieben:
Fr 1. Dez 2017, 11:34
aus welchem Grund sind Rules in Verruf geraten?
Hier ist eine längere Diskussion zu dem Thema:

https://www.postgresql.org/message-id/f ... .gmail.com

Re: UPDATE verhindern

Verfasst: Sa 2. Dez 2017, 22:08
von pogomips
Trigger wäre eine Möglichkeit.

Wenn Du clientseitig flexibel bist, könntest Du auch eine Update Function verwenden, die alles berücksichtigt und das Update Recht auf die Tabelle direkt entfernen.
Ggf mehrere Functions, die Sperren, Entsperren des Masters regeln und die Clienttabelle intelligent füttern.
Das Sperrfeld könnte dann clientseitig auch immer readonly sein.
Damit ließen sich auch Grenzfälle gut behandeln, wo nicht nur ein Update auf die Nutzdaten von tbl_b gemacht wird, sondern auch auf die Referenz zum Master, also ein "umhängen" des Datensatzes.