Quantcast
Channel: Teguh Triharto Learning Center
Viewing all articles
Browse latest Browse all 413

.::: How to enable CDC (Change Data Capture) in PostgreSQL, EDB with user,ip client :::.

$
0
0
 

correlation https://teguhth.blogspot.com/2024/04/how-to-enable-cdc-change-data-capture.html

1. Enable WAL (Write-Ahead Logging): PostgreSQL uses Write-Ahead Logging for durability. Ensure that your PostgreSQL server is configured to use WAL.

2. Create Audit Table: Create an audit table where you will log the changes.


CREATE TABLE audit_table (
    id SERIAL PRIMARY KEY,
    table_name TEXT NOT NULL,
    action_type TEXT NOT NULL,
    old_data JSONB,
    new_data JSONB,
    changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    performed_by VARCHAR(100),
    ip_client TEXT NOT NULL
);


3. Create Trigger Function
## Create Trigger Function
CREATE OR REPLACE FUNCTION cdc_trigger_function()
RETURNS TRIGGER AS $$
BEGIN
    IF (TG_OP = 'DELETE') THEN
        INSERT INTO audit_table (table_name, action_type, old_data, performed_by,ip_client)
        VALUES (
            TG_TABLE_NAME,
            'DELETE',
            row_to_json(OLD),
            session_user,
            COALESCE(host(inet_client_addr()), 'localhost')
        );
        RETURN OLD;

    ELSIF (TG_OP = 'INSERT') THEN
        INSERT INTO audit_table (table_name, action_type, new_data, performed_by,ip_client)
        VALUES (
            TG_TABLE_NAME,
            'INSERT',
            row_to_json(NEW),
            session_user,
            COALESCE(host(inet_client_addr()), 'localhost')
        );
        RETURN NEW;

    ELSIF (TG_OP = 'UPDATE') THEN
        INSERT INTO audit_table (table_name, action_type, old_data, new_data, performed_by,ip_client)
        VALUES (
            TG_TABLE_NAME,
            'UPDATE',
            row_to_json(OLD),
            row_to_json(NEW),
            session_user,
            COALESCE(host(inet_client_addr()), 'localhost')
        );
        RETURN NEW;
    END IF;
END;
$$ LANGUAGE plpgsql;

4. Create Trigger Function
## Create Trigger

CREATE TRIGGER cdc_trigger_pembelian
AFTER INSERT OR UPDATE OR DELETE ON pembelian
FOR EACH ROW
EXECUTE FUNCTION cdc_trigger_function();


5. Test Insert, update & Delete
# test insert
insert into pembelian(KODE_PEMBELIAN,KODE_BARANG,KODE_CUSTOMER,TANGGAL_PEMBELIAN,JUMLAH_PEMBELIAN) values('BEL-E016','ELK-04','B-0002','2002-07-17',16);
insert into pembelian(KODE_PEMBELIAN,KODE_BARANG,KODE_CUSTOMER,TANGGAL_PEMBELIAN,JUMLAH_PEMBELIAN) values('BEL-E017','ELK-04','B-0002','2002-07-17',17);
insert into pembelian(KODE_PEMBELIAN,KODE_BARANG,KODE_CUSTOMER,TANGGAL_PEMBELIAN,JUMLAH_PEMBELIAN) values('BEL-E018','ELK-04','B-0002','2002-07-17',18);

# test update
UPDATE pembelian SET JUMLAH_PEMBELIAN = '22' WHERE kode_pembelian='BEL-E015';

# test delete
DELETE FROM pembelian WHERE kode_pembelian = 'BEL-E016';


6. check result in table cdc

select * from audit_table;
select * from teguhth.public.audit_table;
 

7. check triger n function

SELECT
    trg.event_object_table AS table_name,
    trg.trigger_name,
    trg.action_timing,
    trg.event_manipulation AS event,
    trg.action_statement,
    proc.proname AS function_name,
    lang.lanname AS language
FROM information_schema.triggers trg
JOIN pg_trigger ptg ON ptg.tgname = trg.trigger_name
JOIN pg_proc proc ON proc.oid = ptg.tgfoid
JOIN pg_language lang ON lang.oid = proc.prolang
WHERE trg.trigger_schema = 'public'
  AND NOT ptg.tgisinternal;

##
SELECT
    tgname AS trigger_name,
    pg_get_triggerdef(oid, true) AS trigger_definition
FROM pg_trigger
WHERE tgname = 'cdc_trigger_pembelian';  -- Ganti dengan nama trigger kamu
 

--- check function
SELECT proname, pg_get_functiondef(p.oid)
FROM pg_proc p
JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE n.nspname = 'public' and proname='cdc_trigger_function';  -- atau schema kamu
 



Viewing all articles
Browse latest Browse all 413

Trending Articles