简体   繁体   English

使用触发器跟踪对PostgreSQL的表进行插入,更新或删除时的更改

[英]Tracking Changes on insert or update or delete on a table for PostgreSQL using trigger

I am creating a table to track changes however it is returning the following error: 我正在创建一个表来跟踪更改,但是它返回以下错误:

"(psycopg2.InternalError) control reached end of trigger procedure without RETURN CONTEXT: PL/pgSQL function change_trigger()" “(psycopg2.InternalError)控件在没有返回上下文的情况下到达了触发过程的结尾:PL / pgSQL函数change_trigger()”

Whenever I perform any of the following actions : insert , change or update 每当我执行以下任何操作时: insertchangeupdate

Please see below table and trigger function 请参见下表和触发功能

Create table for logging changes 创建表以记录更改

Create schema logging;
Create table logging.history(
            id serial,
            tstamp timestamp default now (),
            schemaname text,
            tabname text, 
            operation text, 
            who text default current_user,
            new_val json,
            old_val json);

Create function 创建功能

CREATE function
change_trigger()
RETURNS trigger as $$
BEGIN
        IF TG_OP = 'Insert'
        THEN
            Insert into logging.history (tabname, schemaname, operation, new_val)
            Values (TG_TABLE_NAME,TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW));
            RETURN NEW;
        ELSIF TG_OP = 'Update'
        THEN
            Insert into logging.history (tabname, schemaname, operation, new_val, old_val)
            Values (TG_TABLE_NAME,TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW), row_to_json(OLD));
            RETURN NEW; 
        ELSIF TG_OP = 'Delete'
        THEN
            Insert into logging.history (tabname, schemaname, operation, old_val)
            Values (TG_TABLE_NAME,TG_TABLE_SCHEMA, TG_OP, row_to_json(OLD));
            RETURN OLD;
    END IF;
    END;
    $$ LANGUAGE 'plpgsql';

Link Trigger function to table: 将触发器功能链接到表:

CREATE TRIGGER t AFTER INSERT OR UPDATE OR DELETE ON mytemp

   FOR EACH ROW EXECUTE PROCEDURE change_trigger();

For example, when I perform the following: 例如,当我执行以下操作时:

INSERT into mytemp(column1)
    VALUES ('id2323900')  

the error returns as: 错误返回为:

control reached end of trigger procedure without RETURN CONTEXT: PL/pgSQL function change_trigger() 控件到达触发过程的结尾而没有返回上下文:PL / pgSQL函数change_trigger()

Names of tg_op are ( 'INSERT', 'UPDATE', 'DELETE' ) not ( 'Insert', 'Update', 'Delete' ) - case sensitive, OR change TG_OP = 'Insert' to TG_OP ilike('insert') . tg_op的名称是( 'INSERT', 'UPDATE', 'DELETE' )不( 'Insert', 'Update', 'Delete' )-区分大小写,或者将TG_OP = 'Insert'更改为TG_OP ilike('insert') And I would add 'else' statement at the end with notice: 我将在结尾处添加“ else”语句,并注意:

ELSE 
    NOTICE RAISE 'Unknown tg_op';
    RETURN OLD;
END IF;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM