无法访问PostgreSQL触发器功能中的主键值

时间:2012-02-21 11:35:14

标签: postgresql plpgsql

我刚开始编写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是否有限制或我做错了什么!

1 个答案:

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