不使用Debezium,记录PostgreSQL中的数据的数据前后变化

如果不使用Debezium,可以使用触发器(Trigger)来记录PostgreSQL中的数据的变化。触发器是一种特殊的存储过程,当对表执行INSERT、UPDATE或DELETE操作时,会自动执行触发器中的代码。

以下是一个简单的示例,展示了如何使用触发器记录数据的变化:

1 创建一个用于存储变化记录的表:

CREATE TABLE data_changes (
    id SERIAL PRIMARY KEY,
    operation CHAR(1),
    old_data JSONB,
    new_data JSONB,
    change_time TIMESTAMP NOT NULL DEFAULT NOW()
);

2 为需要监控变化的表创建触发器函数:

CREATE OR REPLACE FUNCTION record_data_changes() RETURNS TRIGGER AS $$
DECLARE
    old_data JSONB;
    new_data JSONB;
BEGIN
    IF (TG_OP = 'DELETE') THEN
        old_data = row_to_json(OLD);
        INSERT INTO data_changes (operation, old_data) VALUES ('D', old_data);
        RETURN OLD;
    ELSIF (TG_OP = 'UPDATE') THEN
        old_data = row_to_json(OLD);
        new_data = row_to_json(NEW);
        INSERT INTO data_changes (operation, old_data, new_data) VALUES ('U', old_data, new_data);
        RETURN NEW;
    ELSIF (TG_OP = 'INSERT') THEN
        new_data = row_to_json(NEW);
        INSERT INTO data_changes (operation, new_data) VALUES ('I', new_data);
        RETURN NEW;
    END IF;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

3 为需要监控变化的表创建触发器:

CREATE TRIGGER data_changes_trigger
AFTER INSERT OR UPDATE OR DELETE ON your_table
FOR EACH ROW EXECUTE FUNCTION record_data_changes();

此方法使用触发器,功能上能实现,但是性能有损失。

其他方法 可以使用 flink sql(推荐,需要flink。可能会需要使用java代码),Debezium (使用kafka,比较麻烦,老版本用的zk。新版可以不用zk)实现。

posted @ 2024-06-04 14:27  过错  阅读(10)  评论(0编辑  收藏  举报