postgresql - 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;
解决方案
这似乎是一种 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();
推荐阅读
- java - 排行榜类问题
- react-native - 网络请求在反应本机博览会客户端中失败
- javascript - 在 React 项目中安装语义 UI 时遇到很多麻烦
- excel - 在“PROD”和“DEV”模式之间快速切换
- hybris - Hybris 启动错误
- java - PDFBox 2.0.15 的外部签名
- elasticsearch - 日期范围内的 Elasticsearch 聚合
- php - 如何通过 ajax 从 Summernote 编辑器将数据发送到 php 文件?
- json - 动态读取变量内变量的值
- python - 如何将 Keras 数据生成器(或不同的方法)与多个不同长度的 .npy 文件一起使用?