【问题标题】:Postgresql function return triggerPostgresql函数返回触发器
【发布时间】:2017-12-04 18:42:33
【问题描述】:

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

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

我做错了什么?

【问题讨论】:

  • SELECT * FROM table.loss_func () 你为什么要这样做?你想用这个选择什么?这就是导致错误的原因。删除它,它会尝试创建您的触发器。执行在第一行停止
  • AFTER 触发器不能返回 NULL。 (也不能改变值)

标签: postgresql function database-trigger


【解决方案1】:

您的代码的工作版本。 - 触发器现在触发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(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多