UPDATE verhindern

Fragen und Probleme rund um die Abfragespache SQL.
Antworten
ulrich
Neuer Benutzer
Beiträge: 1
Registriert: Do 30. Nov 2017, 18:01

UPDATE verhindern

Beitrag von ulrich » Do 30. Nov 2017, 18:32

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
Ulrich Goebel, Bonn

Gisman
Erfahrener Benutzer
Beiträge: 1088
Registriert: Fr 20. Jan 2006, 15:30
Wohnort: Pfalz
Kontaktdaten:

Re: UPDATE verhindern

Beitrag von Gisman » Do 30. Nov 2017, 18:49

Ich würde hier Rules oder Trigger verwenden.

Gruß Uwe

akretschmer
Erfahrener Benutzer
Beiträge: 7315
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: UPDATE verhindern

Beitrag von akretschmer » Do 30. Nov 2017, 19:49

Ü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.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Gisman
Erfahrener Benutzer
Beiträge: 1088
Registriert: Fr 20. Jan 2006, 15:30
Wohnort: Pfalz
Kontaktdaten:

Re: UPDATE verhindern

Beitrag von Gisman » Fr 1. Dez 2017, 11:34

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

castorp
Erfahrener Benutzer
Beiträge: 1011
Registriert: Sa 27. Jun 2009, 22:24
Kontaktdaten:

Re: UPDATE verhindern

Beitrag von castorp » Fr 1. Dez 2017, 12:43

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
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

pogomips
Benutzer
Beiträge: 43
Registriert: Fr 18. Nov 2016, 09:55

Re: UPDATE verhindern

Beitrag von pogomips » Sa 2. Dez 2017, 22:08

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.

Antworten