2016-04-25 8 views
0

Ok, also habe ich diese Tabellen. Antwort und Frage.Triggerfehler [plpgsql]

Antwort Tabelle hat:

answerID (PK)

Antwort

datePosted

QuestionID

E-Mail

Frage Tisch hat:

QuestionID (PK)

Frage

datePosted

E-Mail

i sicherstellen möchten, dass der Benutzer (E-Mail), die eine Frage beantwortet gehört das Benutzer-Netzwerk des Benutzers (E-Mail), der eine Frage gestellt hat. Mein Benutzernetzwerk kann durch eine andere Tabelle erstellt werden, die hier keine Geschäfte hat. Ich habe eine Funktion, die das Benutzer-Netzwerk eines bestimmten Benutzers findet. So schrieb ich den folgenden Code:

CREATE OR REPLACE FUNCTION "Social_Network".answers_only_by_users_in_user_network() 
    RETURNS TRIGGER AS 

    $$ 
    begin 
    IF new.email NOT IN (select network_email from  "Social_Network".find_user_network(question.email)) then 
     RAISE EXCEPTION 'user that answered does not belong in user network'; 
     return null; 
    else 
     return new; 
    end if; 
    end; 
    $$ 
    LANGUAGE plpgsql VOLATILE 


    CREATE TRIGGER answer_restriction BEFORE INSERT OR UPDATE ON  "Social_Network".answer 
    for each row execute procedure  "Social_Network".answers_only_by_users_in_user_network(); 

Die Funktion find_user_network findet das Benutzer-Netzwerk eines bestimmten Benutzers. Ich mache diesen Trigger für die Antwort-Tabelle, aber ich habe ein Problem in der IF-Anweisung, weil ich im Eingabeargument der Funktion find_user_network die E-Mail aus der Tabelle Frage stellen möchte. Aber es knallt Fehler, wenn ich versuche, die Daten von den oben genannten Tabellen zu bearbeiten, um zu überprüfen, ob mein Auslöser richtig funktioniert. Der Fehler besagt, dass ich die FROM-Klausel-Eintrag für Tabelle Frage fehlt und es zeigt meine Zeile 3 der Trigger-Funktion, wo die if-Anweisung ist.

Mein Trigger wurde erfolgreich erstellt und meine Triggerfunktion ebenfalls. Aber dieser Fehler bleibt bestehen. Irgendwelche Ideen, was ich falsch mache? Danke!

Antwort

0

Das PostgreSQL überprüft nur die Syntax eingebetteter Abfragen in der Kompilierzeit. Vollständige Überprüfung (Semantik) ist in der Laufzeit.

Die Abfrage

SELECT new.email NOT IN 
    (SELECT network_email 
    FROM "Social_Network".find_user_network(**question**.email)) 

ist falsch, weil question.email qualifizierte Bezeichner (Format tabellenname.spaltenname) Tabelle bezogen ist: Frage. Aber Bezug auf diese Beziehung ist nicht in dieser Abfrage deklariert.

Verwandte Themen