利用触发器实现数据同步

--在数据库test中创建表aa
use test
go
create table aa(id int primary key not null,name1 varchar(20),name2 varchar(20),name3 varchar(20))
--在数据库test1中创建表bb
use test1
go
create table bb(id int primary key not null,name1 varchar(20),name2 varchar(20),name3 varchar(20))
--在数据库test2中创建表cc
use test2
go
create table cc(id int primary key not null,name1 varchar(20),name2 varchar(20),name3 varchar(20))
go
use test
go
--创建跨库触发器,实现aa表中每个id对应的name2,name3改变时,就相应改变数据库test1中的bb表和数据库test2中的cc表
CREATE TRIGGER test_aa on aa
for update,insert,delete
as
if not exists (select * from deleted) --插入
begin
insert test1..bb(id,name2) select id,name2 from inserted
insert test2..cc(id,name3) select id,name3 from inserted
end
else if not exists (select * from inserted)--删除
begin
delete test1..bb where id in (select id from deleted)
delete test2..cc where id in (select id from deleted)
end
else--更新
begin
update test1..bb set name2=inserted.name2 from inserted where test1..bb.id=inserted.id
update test2..cc set name3=inserted.name3 from inserted where test2..cc.id=inserted.id
end
go
--测试
select * from test..aa
select * from test1..bb
select * from test2..cc
go
use test
go
--插入数据
insert aa values(1,'aa','bb','cc')
insert aa values(2,'aa1','bb1','cc1')
insert aa values(3,'aa2','bb2','cc2')
--测试
select * from test..aa
select * from test1..bb
select * from test2..cc
go
use test
go
--删除数据
delete aa where id=2
go
--测试
select * from test..aa
select * from test1..bb
select * from test2..cc
go
use test
go
--更新数据
update aa set name2='bb22' where id=3
go
--测试
select * from test..aa
select * from test1..bb
select * from test2..cc
go
 
### 使用 PLSQL 触发器实现数据同步 在 Oracle 数据库中,触发器是一种特殊的存储过程,在特定事件发生时自动执行。对于双表之间的数据同步,可以通过定义 `AFTER INSERT` 或者 `BEFORE UPDATE` 类型的触发器实现实时的数据复制。 #### 方法一:使用简单触发器进行单条记录操作 当一条新纪录被插入到源表时,通过触发器将相同的内容写入目标表: ```sql CREATE OR REPLACE TRIGGER trg_sync_table_a_to_b AFTER INSERT ON table_a FOR EACH ROW BEGIN INSERT INTO table_b (col1, col2, ...) VALUES (:NEW.col1, :NEW.col2, ...); END; / ``` 这种方法适用于每次只处理单一事务的情况[^1]。 #### 方法二:采用复合触发器提高性能 为了优化大量数据插入场景下的效率,推荐使用复合触发器(Compound Trigger)。这种方式允许在一个会话期间收集多个变更并一次性提交给另一张表,从而减少 I/O 开销: ```sql CREATE OR REPLACE TRIGGER trg_bulk_sync_tables FOR INSERT ON source_table COMPOUND TRIGGER TYPE t_row IS RECORD ( id NUMBER, value_1 VARCHAR2(50), ... ); TYPE t_rows IS TABLE OF t_row INDEX BY PLS_INTEGER; l_changes t_rows; AFTER EACH ROW IS BEGIN -- 收集每一行的变化 l_changes(l_changes.COUNT + 1).id := :new.id; l_changes(l_changes.COUNT).value_1 := :new.value_1; ... END AFTER EACH ROW; AFTER STATEMENT IS BEGIN -- 批量更新目标表 FORALL i IN INDICES OF l_changes INSERT INTO target_table (id, value_1,...) VALUES (l_changes(i).id, l_changes(i).value_1,...); -- 清除集合以便下次调用 l_changes.DELETE(); END AFTER STATEMENT; END trg_bulk_sync_tables; / ``` 此代码片段展示了如何利用 `COMPOUND TRIGGER` 和 `FORALL` 来提升大批量数据同步的速度和资源利用率[^2]。 另外需要注意的是,在某些情况下可能还需要考虑主键冲突等问题,这时可以在触发器内部加入逻辑判断以确保唯一性约束不会违反[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值