2017-12-04 20 views
1

트리거에 문제가 있습니다. 동일한 테이블에서 INSERT 업데이트 필드를 수행 할 때 트리거 및 함수를 만들었습니다 ( ). 는 반환 :Postgresql 함수가 트리거를 반환합니다.

Error: function "loss_func" in FROM has return type trigger that is not supported LINE 1: SELECT * FROM table.loss_func()

기능

CREATE OR REPLACE FUNCTION loss_func() 
    RETURNS trigger AS $loss_func$ 
    BEGIN 
    NEW.dt_creation := to_char(now(), 'YYYY-MM-DD'); 

    RETURN NULL; 
    END; 
    $loss_func$ LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION loss_func() 
    OWNER TO postgres; 

트리거 내가 잘못 뭐하는 거지

CREATE TRIGGER tgr_loss 
    AFTER INSERT ON loss 
    FOR EACH ROW 
    EXECUTE PROCEDURE loss_func(); 

?

+0

'SELECT * FROM table.loss_func()'이 작업을 수행하는 이유는 무엇입니까? 이걸로 무엇을 선택하려고합니까? 이것이 오류의 원인입니다. 그것을 제거하면 트리거를 만들려고 시도합니다. 실행이 첫 줄에서 멈 춥니 다 –

+1

왜 날짜를'varchar'로 저장하고 있습니까? –

+0

'AFTER' 트리거는 NULL을 반환 할 수 없습니다. (값도 변경할 수 없음) – Jasen

답변

0

코드의 유효한 버전입니다. - 트리거는 지금 BEFORE 삽입을 발사하고 dt_creation의 값을 업데이트하고 레코드의 NEW 버전 반환

drop table loss; 

create table loss (
id int , 
dt_created varchar); 

CREATE OR REPLACE FUNCTION loss_func() 
    RETURNS trigger AS $loss_func$ 
    BEGIN 
    NEW.dt_created := to_char(now(), 'YYYY-MM-DD'); 
    RETURN NEW; 
    END; 
    $loss_func$ LANGUAGE plpgsql VOLATILE 
    COST 100; 

ALTER FUNCTION loss_func() 
    OWNER TO postgres; 

CREATE TRIGGER tgr_loss 
    BEFORE INSERT ON loss 
    FOR EACH ROW 
    EXECUTE PROCEDURE loss_func(); 

insert into loss(id) values(1); 
내가 트리거의 사용을 방지하기 위해 제안 할 수

또 다른 솔루션에 대한 기본 값을 사용하는 것입니다 당신이 now()에 기본 값을 설정 테이블을 변경할 수 있습니다

... 
dt_creation timestamp default now(), 
... 

나 : 테이블을 만들고 (대신 VARCHAR로 날짜를 저장하는 타임 스탬프를 사용) dt_creation

alter table loss 
alter column dt_creation set default now();