2011-09-21 33 views
0
DELETE

我試圖捕捉到一個表中的數據變化,並正在執行插入或更新後,下面的觸發功能以及BEFORE UPDATE或DELETE:觸發不讓我在PostgreSQL中

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表中。如果我禁用觸發器,那麼我可以從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'); 

回答

3

返回OLD當觸發了刪除,NEW的更新運行。

+0

這個伎倆!謝謝。 – Rob

+0

不客氣。順便說一句,你的觸發器可以通過執行'NEW.test ='new value''來修改某些值。當「OLD」以外的東西被返回時,刪除被取消;更新在返回「NEW」時被取消。這僅適用於[在觸發器概述](http://developer.postgresql.org/pgdocs/postgres/trigger-definition.html)中所述的行之前觸發器。 –