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();
我有以下功能和带有序列设置的触发器:
我想创建一个函数并触发,每当我向 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();