2012-02-21 2 views
1

방금 ​​PL/pgSQL 트리거 기능을 작성하기 시작했습니다. 나는 Student와 Result라고 불리는 몇 개의 테이블을 가지고있다. 다음 칼럼을 가진 학생. ID, 이름, 제목, 마크 (ID는 기본 키)과 결과 테이블이 ID, 하나 개의 레코드가 학생 테이블에 추가 될 때마다PostgreSQL 트리거 기능의 기본 키 값에 액세스 할 수 없습니다.

가, 내가 원하는 상태와 같은 두 개의 열을 가지고있다 학생 표의 표시를 확인하여 결과표를 업데이트하려면 입력 한 부호가 50보다 큰 경우 하나의 레코드가 ID 및 상태 = 통과로 결과 테이블에 삽입되어야하며 50보다 작 으면 상태가 실패합니다 . 제가 I 하드 차 키 값을 부호화 한 이후 예상로 활동이 기능이 트리거에 의해


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"(); 

을 달성하기 위해 다음의 트리거 기능을 갖는다. 내가 "결과"에 다음

INSERT 같은 트리거 기능 내부의 SQL을 수정하는 경우 그러나 NEW.ID을 선택, '실패'; (또는) INSERT INTO "결과"SELECT NEW.ID, 'pass';

그것은

> ***Record "new" has no field "id" Context : PL/pgSQL function 
> "UpdateResult" line 3 at SQL statement*** 

같은 오류를 던지고는 새로운 변수가 아니라 기본 키 값에서 비 기본 키 값의 값을 가질 수 있습니다 의미합니다. 어느 누구도 PL/pgSQL에 제한이 있는지 말해 줄 수 있습니까? 아니면 잘못하고 있습니까?

+2

은 "ID"필드의 총액을 확인 - 그것은 수도에 있다면 당신은 (그것을 인용하여) 그 같은 방법을 사용해야합니다 : INSERT 결과 "INTO "새 선택."ID ", NEW.name; –

+0

Milen. 안녕하세요, 대문자입니다. 따옴표를 추가 한 후 작동하고 있습니다. 이유는 무엇입니까? – Murugesh

+0

[식별자 및 키워드] (http://www.postgresql.org/docs/) current/static/sql-syntax-lexical.html # SQL-SYNTAX-IDENTIFIERS)에서 "quoted identifier"를 찾으십시오. –

답변

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(); 
관련 문제