Postgres 函数触发器序列依赖错误

Postgres Function Trigger Sequence Dependency Error

我有以下功能和带有序列设置的触发器:

我想创建一个函数并触发,每当我向 STRATEGY_SITES table 添加新行时,'SITE_NUM' 字段将具有来自 [=25= 的新序号].模式名称是 gismgr。

我收到以下 error:Underlying DBMS 错误[错误:控制到达触发过程的末尾,没有 return 上下文:PL/pgSQL 函数 process_sites_edit()(gismgr.strategy_sites)::SQLSTATE=2F005][gismgr.startegy_sites]

CREATE OR REPLACE FUNCTION process_sites_edit() RETURNS TRIGGER AS $SITE_EDIT_TRIGGER$
   begin
            new.SITE_NUM := nextval('gismgr.SITENUM_SEQ');
end;
$SITE_EDIT_TRIGGER$ LANGUAGE 'plpgsql';
create TRIGGER SITE_EDIT_TRIGGER
before insert or update on STRATEGY_SITES for each row
EXECUTE PROCEDURE process_strategy_sites_edit();
CREATE SEQUENCE gismgr."SITENUM_SEQ" owned by gismgr.strategy_Sites.site_num
    INCREMENT 1
    START 19080
    MINVALUE 19080
    MAXVALUE 9999999999999999
    CACHE 20;

这似乎是一个在 Postgres 中不需要的 ORACLEism。假设您的 table 已经存在,那么

alter table *table_name* alter column site_num default nextval('gismgr.SITENUM_SEQ')

还要确保插入内容没有提及 site_num 列。如果您觉得必须继续使用触发器方法,那么您的触发器函数需要指定 return 值。

CREATE OR REPLACE FUNCTION process_sites_edit() 
RETURNS TRIGGER AS $SITE_EDIT_TRIGGER$
begin
     new.SITE_NUM := nextval('gismgr.SITENUM_SEQ');
     return new;
end;
$SITE_EDIT_TRIGGER$ LANGUAGE 'plpgsql';

我还建议您不要在更新时触发触发器。这将更改给定行的 any/every 更新的站点编号是否有 FK 引用它 - 它们不会被更新,更新将失败。此外,执行的过程必须与函数名称匹配:

create TRIGGER SITE_EDIT_TRIGGER
before insert on STRATEGY_SITES for each row
EXECUTE PROCEDURE process_sites_edit();