好的,我有这些表格。答案和问题。
答案表有:
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语句。
我的触发器已成功创建,我的触发器功能也已成功。但是这个错误仍然存在。关于我做错的任何想法? 谢谢!
答案 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)。但是在此查询中未声明对此关系的引用。