postgresql - 触发器不让我在 PostgreSQL 中删除

标签 postgresql data-warehouse cdc

我正在 try catch 表上的数据更改,并在插入或更新之后以及更新或删除之前执行以下触发函数:

CREATE OR REPLACE FUNCTION cdc_test_function()
  RETURNS trigger AS
$BODY$
DECLARE op cdc_operation_enum;
BEGIN
    op = TG_OP;
    IF (TG_WHEN = 'BEFORE') THEN
        IF (TG_OP = 'UPDATE') THEN
            op = 'UPDATE_BEFORE';
        END IF;

        INSERT INTO cdc_test VALUES (DEFAULT, DEFAULT, op, DEFAULT, DEFAULT, OLD.*);
    ELSE
        IF (TG_OP = 'UPDATE') THEN
            op = 'UPDATE_AFTER';
        END IF;

        INSERT INTO cdc_test VALUES (DEFAULT, DEFAULT, op, DEFAULT, DEFAULT, NEW.*);
    END IF;

    RETURN NEW;
END;

我的更改表 (CDC_TEST) 正在正确捕获所有内容,我可以在我的 TEST 表中插入和更新记录。但是,当我尝试 DELETE 时,它在 CDC_TEST 中完美地记录了 DELETE 条目,但该记录仍保留在我的 TEST 表中。如果我禁用触发器,那么我可以从测试中删除就好了。这是我用来创建表的代码以及枚举的代码:

CREATE TABLE test
(
  test_id serial NOT NULL,
  value text NOT NULL,
  CONSTRAINT test_pkey PRIMARY KEY (test_id )
)

CREATE TABLE cdc_test
(
  cdc_test_id bigserial NOT NULL,
  cdc_timestamp timestamp with time zone DEFAULT now(),
  cdc_opeation cdc_operation_enum,
  cdc_user name DEFAULT "current_user"(),
  cdc_transaction_id bigint DEFAULT txid_current(),
  test_id integer,
  value text,
  CONSTRAINT cdc_test_pkey PRIMARY KEY (cdc_test_id )
)

CREATE TYPE cdc_operation_enum AS ENUM( 'DELETE', 'INSERT', 'UPDATE_BEFORE', 'UPDATE_AFTER', 'UPDATE' );

最佳答案

当触发器运行删除时返回 OLD,更新时返回 NEW

关于postgresql - 触发器不让我在 PostgreSQL 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7505268/

相关文章:

oracle - 如何解决 OWBSYS 用户中无效的 JAVA CLASS

snowflake-cloud-data-platform - 表的雪花更改跟踪元数据

sql-server - 为什么 NULL 值在事实表中映射为 0?

windows - 如何在 Windows、Linux、OS X 上打开和写入/读取 USB CDC "serial"设备?

SQL Server 2008更改数据捕获,谁进行了更改?

python - 错误: trying to redefine a primary key as non-primary key

sql - Postgres,选择条件

ruby-on-rails - 将 json 文件数据保存到 Rails 数据库中

postgresql jdbc、pgobject可用类型、数组类型

ETL操作-返回主键