我刚开始编写PL / pgSQL触发器功能。我有几个名为Student和Result的表。学生有以下专栏。 ID,名称,主题,标记(ID是主键) ,结果表包含两列,例如 ID,状态
每当在学生表中添加一条记录时,我想通过检查学生表中的标记来更新结果表,如果输入的标记大于50,则应在结果表中插入一条记录,其中包含ID和Status = Pass,如果小于50,则状态将失败。 我有以下触发功能来实现这个
CREATE OR REPLACE FUNCTION "UpdateResult"() RETURNS trigger AS $BODY$
BEGIN
IF NEW.mark < 50 THEN
INSERT INTO "Result" SELECT 92,'fail';
RETURN NEW;
ELSE
INSERT INTO "Result" SELECT 92,'pass';
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT SECURITY DEFINER
COST 100;
ALTER FUNCTION "UpdateResult"() OWNER TO postgres;
CREATE TRIGGER "Result"
AFTER INSERT
ON "Student"
FOR EACH ROW
EXECUTE PROCEDURE "UpdateResult"();
通过此功能,触发器按预期工作,因为我已对主键值进行了硬编码。 但是当我在Trigger函数中修改SQL时,如下所示
INSERT INTO“结果”SELECT NEW.ID,'fail'; (或) INSERT INTO“结果”SELECT NEW.ID,'pass';
像
那样抛出错误> ***Record "new" has no field "id" Context : PL/pgSQL function
> "UpdateResult" line 3 at SQL statement***
表示能够从NEW变量获取非主键值的值而不是主键值。请问任何人请告诉我PL / pgSQL是否有限制或我做错了什么!
答案 0 :(得分:1)
只是一个提示:你为什么使用引用的名字?这样做时,你必须关心大写。
看看是否有效:
CREATE OR REPLACE FUNCTION UpdateResult() RETURNS trigger AS $BODY$
BEGIN
IF NEW.mark < 50 THEN
INSERT INTO result (id, status) values (92,'fail');
RETURN NEW;
ELSE
INSERT INTO result (id, status) values (92,'pass');
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT SECURITY DEFINER
COST 100;
ALTER FUNCTION UpdateResult() OWNER TO postgres;
CREATE TRIGGER Result
AFTER INSERT
ON Student
FOR EACH ROW
EXECUTE PROCEDURE UpdateResult();