簡體   English   中英

Postgres 函數觸發序列依賴錯誤

[英]Postgres Function Trigger Sequence Dependency Error

我有以下功能並通過序列設置觸發:

我想創建一個函數並觸發,每當我向 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;

這似乎是一種在 Postgres 中不必要的 ORACLEism。 假設你的表已經存在,那么就

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM