当前位置:   article > 正文

【数据库表的快照】如何优雅的做postgresql快照表

快照表

目录

一.快照表是什么

二.怎么去实现

1.无软删除主表

1.1 建主表

1.2 建快照表

1.3 创建test表的trigger

2.存在软删除主表

2.1 建主表

2.2 建快照表

2.3 创建test表的trigger

三、意义


一.快照表是什么

        首先,先解释一下快照的意思,快照:顾名思义,最初的意思就是在某一时间段快速拍一张照片做记录,那拍照片的意义是什么?意义是为了让我们以后看到这个的时候,有迹可循。那么快照表的意思其实就很简单了,就是为了来记录我们之前做的一些操作。快速的记录下我们这一瞬间的操作,可以让我们在发生问题的时候可以更好的溯源。

二.怎么去实现

目前能想到的方式是两种:

1.通过Spring AOP的方式去实现,在增删改的dao层方法上做切点,当被调用时,将信息存入指定的snapshot表中(这种方式的弊端就是,如果有人在数据库中直接操作数据了,那么操作的记录不会被保存到快照表中,所以我们今天先主要讲一下第二种实现)。

2.通过数据库自带的存储过程和触发器来实现。废话不多说。贴代码

1.无软删除主表

1.1 建主表

  1. create table test(
  2. id bigserial primary key,
  3. name text,
  4. created_by text,
  5. created_at timestamp default now(),
  6. updated_by text,
  7. updated_at timestamp default now()
  8. )

1.2 建快照表

  1. create table test_snapshot(
  2. test_snapshot_id bigserial primary key,
  3. id bigint,
  4. name text,
  5. created_by text,
  6. created_at timestamp default now(),
  7. event_type text check (event_type in ('create', 'update', 'delete'))
  8. )

1.3 创建test表的trigger

当是删除操作的时候,一定要用OLD,因为数据一旦被删除之后,用NEW.属性都是为null

  1. DROP TRIGGER IF EXISTS test_snapshot ON test;
  2. CREATE
  3. OR REPLACE FUNCTION process_test_snapshot()
  4. RETURNS TRIGGER AS
  5. $$
  6. BEGIN
  7. IF
  8. (TG_OP = 'DELETE') THEN
  9. INSERT INTO test_snapshot (id, name, created_by, created_at, event_type)
  10. VALUES( OLD.id, OLD.name, OLD.updated_by, OLD.updated_at, 'delete');
  11. ELSIF
  12. (TG_OP = 'UPDATE') THEN
  13. INSERT INTO test_snapshot (id, name, created_by, created_at, event_type)
  14. VALUES( NEW.id, NEW.name, NEW.updated_by, NEW.updated_at, 'update');
  15. ELSIF
  16. (TG_OP = 'INSERT') THEN
  17. INSERT INTO test_snapshot (id, name, created_by, created_at, event_type)
  18. VALUES( NEW.id, NEW.name, NEW.created_by, NEW.created_at, 'create');
  19. END IF;
  20. RETURN NULL;
  21. END;
  22. $$
  23. LANGUAGE plpgsql;
  24. CREATE TRIGGER test_snapshot
  25. AFTER INSERT OR
  26. UPDATE OR
  27. DELETE
  28. ON test
  29. FOR EACH ROW EXECUTE FUNCTION process_test_snapshot();

2.存在软删除主表

上述的是不存在软删除的表,那么我下面会讲一下存在软删除的表该怎么去建trigger。

2.1 建主表

  1. create table test(
  2. id bigserial primary key,
  3. name text,
  4. created_by text,
  5. created_at timestamp default now(),
  6. updated_by text,
  7. updated_at timestamp default now(),
  8. deleted_by text,
  9. deleted_at timestamp default now()
  10. )

2.2 建快照表

  1. create table test_snapshot(
  2. test_snapshot_id bigserial primary key,
  3. id bigint,
  4. name text,
  5. created_by text,
  6. created_at timestamp default now(),
  7. event_type text check (event_type in ('create', 'update', 'delete'))
  8. )

2.3 创建test表的trigger

  1. DROP TRIGGER IF EXISTS test_snapshot ON test;
  2. CREATE
  3. OR REPLACE FUNCTION process_test_snapshot()
  4. RETURNS TRIGGER AS
  5. $$
  6. BEGIN
  7. IF
  8. (TG_OP = 'UPDATE' AND NEW.deleted_by IS NOT NULL) THEN
  9. INSERT INTO test_snapshot (id, name, created_by, created_at, event_type)
  10. VALUES( NEW.id, NEW.name, NEW.deleted_by, NEW.deleted_at, 'delete');
  11. ELSIF
  12. (TG_OP = 'UPDATE') THEN
  13. INSERT INTO test_snapshot (id, name, created_by, created_at, event_type)
  14. VALUES( NEW.id, NEW.name, NEW.updated_by, NEW.updated_at, 'update');
  15. ELSIF
  16. (TG_OP = 'INSERT') THEN
  17. INSERT INTO test_snapshot (id, name, created_by, created_at, event_type)
  18. VALUES( NEW.id, NEW.name, NEW.created_by, NEW.created_at, 'create');
  19. END IF;
  20. RETURN NULL;
  21. END;
  22. $$
  23. LANGUAGE plpgsql;
  24. CREATE TRIGGER test_snapshot
  25. AFTER INSERT OR
  26. UPDATE OR
  27. DELETE
  28. ON test
  29. FOR EACH ROW EXECUTE FUNCTION process_test_snapshot();

ok,到这里我们的trigger就已经创建好了。快去试试效果吧(温馨提示:批量插入的时候也是会一一添加到快照表里面去)

三、意义

我相信肯定会有朋友有疑问,为什么我们需要这么一张表,说当我们在创建一张快照表的时候,其实我们不是会经常的去查看它,使用的频次也不会那么高!!

why ? ? ? ?

确实,我们在创建一张快照表的时候,我们非常少的去看它,去使用它。但是它存在意义有几点:1.当出现问题的时候,我们可以快速的去溯源,去定位问题,比如,当一条数据被误删除了,而我们如果没有快照表的话,我们还要去日志里面去找。但是我们如果存在快照表的话,我们就可以很快的去找到被删除的数据,并且知道是谁删除的,在什么时候删除的。可以让我们快速的做一个复盘。

2.当我们不小心修改一条数据的时候,我们可以快速的在快照表中找到修改之前,这条数据应该是什么样子的,可以很快的帮助我们去复原我们想要还原的数据!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/423078
推荐阅读
相关标签
  

闽ICP备14008679号