好的,我有这些桌子。回答和提问。
应答表有:
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子句-表问题的条目,它将触发器函数的第3行指向if语句所在的位置。
我的触发器已经成功创建,我的触发器函数也已经创建成功。但这一错误依然存在。对我做错了什么有什么想法吗?谢谢!
发布于 2016-04-26 10:37:43
PostgreSQL只在编译时对嵌入式查询进行语法检查。完整检查(语义)在运行时。
查询
SELECT new.email NOT IN
(SELECT network_email
FROM "Social_Network".find_user_network(**question**.email)) 是错误的,因为question.email是与表:问题相关的限定标识符(tablename.columnname格式)。但是在这个查询中没有声明对这个关系的引用。
https://stackoverflow.com/questions/36837390
复制相似问题