Postgresql函数返回触发器

时间:2017-12-04 18:42:34

标签: postgresql function database-trigger

我遇到触发器问题。我创建了一个触发器和一个函数 用于在执行INSERT时更新同一表中的字段。 回来了:

  

错误:FROM中的函数“loss_func”具有返回类型触发器   不支持第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();

我做错了什么?

1 个答案:

答案 0 :(得分: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);

我建议避免使用触发器的另一个解决方案是在创建表时使用dt_creation的默认值(并使用时间戳而不是将日期存储为varchar):

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

或者您可以更改表格以将默认值设置为now()

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