2016-04-25 104 views
0

好吧,我有這些表。答案和問題。觸發錯誤[plpgsql]

回答表有:

answerID(PK)

答案

datePosted

questionID

電子郵件

問表有:

questionID(PK)

問題

datePosted

電子郵件

我想確保,回答一個問題的用戶(電子郵件)屬於用戶(電子郵件)的用戶網絡做了一個問題。我的用戶網絡可以通過另一個在這裏沒有業務的表創建。我有一個功能可以找到特定用戶的用戶網絡。所以我寫了下面的代碼:

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(); 

函數find_user_network找到特定用戶的用戶網絡。 我使這個觸發器的答案表,但我有一個IF語句的問題,因爲在函數find_user_network的輸入參數我想從表問題的電子郵件。但它彈出錯誤,當我試圖編輯上述表中的數據來檢查我的觸發器是否正常工作。 錯誤說我缺少表問題的FROM子句條目,並且它指出了if語句所在的觸發器函數的第3行。

我的觸發器已成功創建,我的觸發器功能也是如此。但是那個錯誤依然存在。任何想法,我做錯了什麼? 謝謝!

回答

0

PostgreSQL在編譯時只對嵌入式查詢進行語法檢查。全面檢查(語義)在運行時。

查詢

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

是錯誤的,因爲question.email是與表的合格標識(格式tablename.columnname):問題。但是在這個查詢中沒有聲明對這個關係的引用。