oracle触发器两个表之间,如何写一个ORACLE触发器同步两个表中的数据?

创建了一个Oracle触发器trg_A,在表A的aa字段更新后,会检查新旧值并更新表B中对应的aa字段,保持数据同步。同时提供了一个SQL2000的分布式事务处理示例,用于在不同服务器间同步数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

答案:CREATE OR REPLACE TRIGGER trg_A

after update

of aa

ON a

referencing new as new old as old

for each row

declare

begin

if :new.aa<>:old.aa then

update B set aa=:new.aa where A.XX=B.XX;

end if;

exception

when others then

null;

end trg_A;其他:楼上已经回答得非常到位了。 --即时同步两个表的实例:

--测试环境:SQL2000,远程主机名:xz,用户名:sa,密码:无,数据库名:test

--创建测试表,不能用标识列做主键,因为不能进行正常更新

--在本机上创建测试表,远程主机上也要做同样的建表操作,只是不写触发器

if exists (select * from dbo.sysobjects where id = object_id(N'[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [test]

create table test(id int not null constraint PK_test primary key

,name varchar(10))

go

--创建同步的触发器

create trigger t_test on test

for insert,update,delete

as

set XACT_ABORT on

--启动远程服务器的MSDTC服务

exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output

--启动本机的MSDTC服务

exec master..xp_cmdshell 'net start msdtc',no_output

--进行分布事务处理,如果表用标识列做主键,用下面的方法

BEGIN DISTRIBUTED TRANSACTION

delete from openrowset('sqloledb','xz';'sa';'',test.dbo.test)

where id in(select id from deleted)

insert into openrowset('sqloledb','xz';'sa';'',test.dbo.test)

select * from inserted

commit tran

go

--插入数据测试

insert into test

select 1,'aa'

union all select 2,'bb'

union all select 3,'c'

union all select 4,'dd'

union all select 5,'ab'

union all select 6,'bc'

union all select 7,'ddd'

--删除数据测试

delete from test where id in(1,4,6)

--更新数据测试

update test set name=name+'_123' where id in(3,5)

--显示测试的结果

select * from test a full join

openrowset('sqloledb','xz';'sa';'',test.dbo.test) b on a.id=b.id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值