2016-08-08 8 views
0

I der nachstehenden TabelleBenutzerdefinierte Einschränkungen in Postgres

Column |   Type   |      Modifiers       
-----------+--------------------------+--------------------------------------------------------- 
id  | integer     | not null default nextval('votes_vote_id_seq'::regclass) 
voter  | character varying  | 
votee  | character varying  | 
timestamp | timestamp with time zone | default now() 

Aktuell haben, habe ich eine eindeutige Einschränkung mit voter und votee was bedeutet, dass pro Benutzer nur 1 Stimme ist

Ich mag würde eine Bedingung erzwingen Dies ermöglicht das wöchentliche Abstimmen mithilfe der Timestamp-Spalte. Ein User kann nur einmal pro Woche für den Votee stimmen.

Gibt es eine Möglichkeit, benutzerdefinierte Einschränkungen für Postgres hinzufügen? Sind sie das gleiche wie Funktionen?

Antwort

0

Eine Einschränkung ist etwas wie ein spezieller Trigger in PostgreSQL.

Normale Trigger können nicht ausgeführt werden, da sie keine gleichzeitigen Änderungen der Datenbank sehen können. Bei zwei gleichzeitig ablaufenden Transaktionen wird zwar die Bedingung erfüllt, aber nach dem Festschreiben kann die Bedingung verletzt werden.

Die Lösung, die ich empfehlen würde, ist SERIALIZABLE Transaktionen in ganz zu verwenden (jeden, einschließlich Leser, hat sich zu benutzen, damit es funktioniert) Ihren Zustand in einem BEFORE Trigger und verifizieren.
SERIALIZABLE wird garantieren, dass das obige Szenario nicht passieren kann.

Verwandte Themen