MongoDB 触发器,监听库/表变更记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB 触发器,监听库/表变更记录相关的知识,希望对你有一定的参考价值。

参考技术A MongoDB 3.6版本之后支持Change Stream,,当MongoDB开启集群(副本集)时可以启用。此文记录Win10本地单进程MongoDB,监听指定表数据变更学习。

当控制台状态变为PRIMARY说明成功。

过滤结构匹配:testDb库,conn表,的insert或update操作。

参考:
https://www.mongodb.com/blog/post/five-minute-mongodb--change-streams-and-mongodb-4x
https://zhuanlan.zhihu.com/p/69610164

oracle触发器记录字段变更

记录变更字段名和原始值…现在值…修改用户…修改时间等基础信息…我知道要用到表级和行级和包…但是不会写…求高人指点…

原来回答过这类问题。其实最直接的办法就是判断每列的old值和new值进行比较,不同的则插入记录表中;但是这样很麻烦,需要做很多判断,如果你的列很多的话,会有很多判断,所以比较繁琐。

另一种思路是这样,更新的记录有old值和new值,两条记录,对这两条记录进行操作,比如:

tab1的表为:
id  col1  col2  col3  col4  col5
 1   B     A      I     D    U
更新了tab1的col2字段变为:
id  col1  col2  col3  col4  col5
 1   B    HELLO   I     D    U
 产生了old和new两条记录,目的是找出值不同的列,跟原表的形式来找的话就需要几个判断。如果我们改变原表的形式的话,可操作性会更强一些,做这些改变。
select decode(col1,'H','col1') t1,'H' t2 from tab1 where id=1
union all
select decode(col2,'E','col2') t1,'E' t2 from tab1 where id=1
union all
select decode(col3,'L','col3') t1,'L' t2 from tab1 where id=1
union all
select decode(col4,'L','col4') t1,'L' t2 from tab1 where id=1
union all
select decode(col5,'O','col5') t1,'0' t2 from tab1 where id=1;
结构变为:
 T1     T2
col1    H
col2    E
col3    L
col4    L
col5    0
这样的话old记录和new记录就各产生一份这种类型的数据集,这是就可以通过select来判断改变的列,存到触发器定义的变量中。
select tab1.T1,tab1.T2 into v_col,v_val from old_record tab1,new_record tab2 where tab1.T1=tab2.T1 and tab1.T2<>tab2.T2
然后插入到记录表中
insert into 记录表 values(v_col,v_val,sysdate);

参考技术A 你应该把表结构列出来,我这里给你提供个思路
现在假设有个表A :
create table a (id number,name varchar2(20));
有个B表去跟踪表A的变化:
create table b (
operat varchar2(10), --做的什么操作,可能的的有删除、插入、修改
col varchar2(10), --修改的列名
orig varchar2(50), --原始值,插入时为空
curr varchar2(50), --现在值,删除时为空
who varchar2(30), --修改用户
when date --修改时间
);

create or replace trigger tri_a_af_idu
after insert or delete or update on a
for each row --行级触发器
begin
if inserting then --如果插入,表A有几个字段就在表B记几行
insert into b values ('insert','id', '',to_char(:new.id),user,sysdate);
insert into b values ('insert','name','',:new.name,user,sysdate);
end if;
if deleting then --删除时新值是空
insert into b values ('delete','id',to_char(:old.id), '',user,sysdate);
insert into b values ('delete','name',:old.name,'',user,sysdate);
end if;
if updating then --更新哪个字段就记录哪个
if :new.id != :old.id then
insert into b values ('update','id',to_char(:old.id),to_char(:new.id),user,sysdate);
end if;
if :new.name != :old.name then
insert into b values ('update','id', :old.name,:new.name,user,sysdate);
end if;
end if;
end;
/
--测试DML操作
insert into a values (1,'111');
insert into a values (2,'222');

update a set id=3,name='333' where id=1;
delete a where id=3;

select * from a;
select * from b;

以上是关于MongoDB 触发器,监听库/表变更记录的主要内容,如果未能解决你的问题,请参考以下文章

捕获mssqlservice 修改表后的数据,统一存储到特定的表中,之后通过代码同步两个库的数据

怎样实时监控sqlserver数据库内记录的变化

oracle触发器记录字段变更

CDC变更数据捕获

oracle触发器

如何使用 websockets 监听 mongodb 中的更新