2017-05-07 6 views
0

Ich bin neu in PostgreSQL. Ich habe einen Trigger gemacht, der nach einem Einfügen in eine Tabelle aktiviert ist. Meine Tabelle enthält Werte, 1 Datumswert für ein Startdatum und 1 Datumswert für ein Enddatum. Wenn ich eine neue Zeile in die Tabelle einfüge, möchte ich prüfen, ob es Überschneidungen mit einem der vorhandenen Daten gibt. Also meine Trigger ist folgendes:Überprüfen Sie, ob ein Wert in einer Rückfrage in Postgresql

CREATE OR REPLACE FUNCTION insert_new() 
RETURNS TRIGGER AS $$ 
BEGIN 
    if ('t' = any (select ((NEW.start_date, NEW.end_date) overlaps (start_date, end_date)) from "mytable")) then 
     RAISE EXCEPTION 'Invalid insertion!'; 
    else 
     return NEW; 
    end if; 
END; 
$$ LANGUAGE plpgsql; 

Es scheint mir richtig, aber wenn ich versuche, eine neue Zeile in meiner Tabelle einzufügen bekomme ich jedes Mal die Ausnahme. Ich kann nicht verstehen, warum das passiert .. Irgendwelche Gedanken? Vielen Dank im Voraus ..

Hier ist der Trigger-Code erstellen:

CREATE TRIGGER check_insert 
AFTER INSERT ON "mytable" 
FOR EACH ROW 
WHEN (NEW.status = 'current') 
EXECUTE PROCEDURE insert_new(); 
+0

Ich weiß nicht, ob es helfen wird, das ist nur schnell zu bemerken. Prüfe, ob es hilft: '' if 't' = any (wähle ((NEW.start_date, NEW.end_date) überlappt (start_date, end_date)) von "mytable") then'' – Sylogista

+0

Diese Klammer sieht ein bisschen verdächtig aus, aber ich weiß es wirklich nicht. – Sylogista

+0

@Sylogista Ich habe versucht, ohne die Klammer, aber ich bekomme das gleiche Ergebnis .. –

Antwort

0
CREATE TRIGGER check_insert 
BEFORE INSERT ON "mytable" 
FOR EACH ROW 
WHEN (NEW.status = 'current') 
EXECUTE PROCEDURE insert_new(); 

Sie haben AFTER INSERT Scheck, Trigger fallen, dann erstellen Sie mit mit BEFORE statt AFTER und versuchen Einsätze wieder

Verwandte Themen