触发错误[plpgsql]

时间:2016-04-25 10:00:10

标签: 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查找特定用户的用户网络。 我正在为Answer表创建这个触发器,但我在IF语句中有一个问题,因为在函数find_user_network的输入参数中我想把表格中的电子邮件问题。但是当我尝试编辑上表中的数据以检查我的触发器是否正常工作时,它会弹出错误。 错误说我错过了表格问题的FROM子句条目,它指向触发器函数的第3行if语句。

我的触发器已成功创建,我的触发器功能也已成功。但是这个错误仍然存​​在。关于我做错的任何想法? 谢谢!

1 个答案:

答案 0 :(得分:0)

PostgreSQL仅在编译时对嵌入式查询进行语法检查。完整检查(语义)是在运行时。

查询

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

是错误的,因为 question.email 是与table:question相关的限定标识符(格式tablename.columnname)。但是在此查询中未声明对此关系的引用。