PostgreSQL prüft die Bedingung für die Bedingung des Fremdschlüssels

8

Ich habe eine Tabelle von Benutzern zB:

%Vor%

und eine Tabelle mit Jobs:

%Vor%

Die Jobs können Benutzern zugewiesen werden, aber nur für Superuser. Anderen Benutzern können keine Jobs zugewiesen werden.

Ich habe also eine Tabelle, in der ich sehe, welcher Job welchem ​​Benutzer zugewiesen wurde:

%Vor%

Aber ich möchte eine Check-Einschränkung erstellen, dass user_id auf einen Benutzer verweist, der user.superuser = True hat.

Ist das möglich? Oder gibt es eine andere Lösung?

    
microo8 23.04.2014, 07:18
quelle

3 Antworten

10

Dies würde für INSERTS funktionieren:

%Vor%

Und dann eine Überprüfung der Tabelle user_has_job:

%Vor%

Funktioniert für Einfügungen:

%Vor%

Dies ist jedoch möglich:

%Vor%

Wenn Sie das Aktualisieren von Benutzern zulassen, müssen Sie daher einen Aktualisierungstrigger für die Benutzertabelle erstellen, um dies zu verhindern, wenn der Benutzer über Jobs verfügt.

    
Michael Legart 23.04.2014, 07:52
quelle
3

Der einzige Weg, an den ich denken kann, ist das Hinzufügen einer eindeutigen Einschränkung für (id, superuser) zur Tabelle users und das Referenzieren der Tabelle user_has_job durch "duplizieren" des dortigen Flags superuser :

%Vor%

Aufgrund des Werts default müssen Sie beim Einfügen in die Tabelle superuser nicht die Spalte user_has_job angeben. So funktioniert der folgende Einsatz:

%Vor%

Aber versuchen, Arthur in die Tabelle einzufügen, scheitert:

%Vor%

Dies verhindert auch, dass furt zu einem Nicht-Superuser wird. Das folgende Update:

%Vor%

schlägt mit dem Fehler fehl

  

FEHLER: Aktualisieren oder Löschen in der Tabelle "Benutzer" verletzt die Fremdschlüsseleinschränkung "user_has_job_user_id_fkey1" in der Tabelle "user_has_job"
   Detail: Schlüssel (ID, Superuser) = (2, t) wird immer noch aus der Tabelle "user_has_job" referenziert.

    
a_horse_with_no_name 23.04.2014 08:04
quelle
0

Ich weiß nicht, ob das ein guter Weg ist, aber es scheint zu funktionieren

%Vor%     
thiout_p 23.04.2014 07:41
quelle