触发不让我在PostgreSQL中删除

时间:2011-09-21 19:08:12

标签: postgresql data-warehouse cdc

我正在尝试捕获表上的数据更改,并在执行INSERT INSAL或UPDATE以及BEFORE UPDATE或DELETE之后执行以下触发器功能:

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表中完成INSERT和UPDATE记录。但是,当我尝试DELETE时,它会在CDC_TEST中完美地记录DELETE条目,但记录仍保留在我的TEST表中。如果我禁用触发器,那么我可以从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' );

1 个答案:

答案 0 :(得分:3)

当触发器运行删除时返回OLDNEW进行更新。