UPDATE verhindern

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:

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

Ich würde hier Rules oder Trigger verwenden.

Gruß Uwe

Ü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.

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

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.