首页 > 解决方案 > Postgres 函数触发序列依赖错误

问题描述

我具有以下功能并通过序列设置触发:

我想创建一个函数并触发每当我向 STRATEGY_SITES 表添加新行时,“SITE_NUM”字段将具有来自 SITENUM_SEQ 的新序列号。模式名称是 gismgr。

我收到以下错误:基础 DBMS 错误 [错误:控制到达触发过程结束而没有返回上下文: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;

标签: postgresqldatabase-triggerpostgresql-triggers

解决方案


这似乎是一种 ORACLE 主义,在 Postgres 中是不必要的。假设您的表已经存在,那么就

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

还要确保插入未提及 site_num 列。如果您觉得必须继续使用触发方法,则您的触发函数需要指定返回值。

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';

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

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

推荐阅读