我遇到触发器问题。我创建了一个触发器和一个函数 用于在执行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();
我做错了什么?
答案 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();