为人师表在线看 下载:SQL高手帮我

来源:百度文库 编辑:中科新闻网 时间:2024/04/29 20:26:36
两台电脑1和2,现在需要1和2中SQL数据库中的数据要保持同步,就是在1中建立一个“链接数据库”,给1中的表建立一个触发器,1中的表如果有添加,删除或修改那么2中的数据也随着变化,(最好是用触发器调用存储过程),谁能给我代码阿,正确有加分,先谢谢了!
一楼的代码我试过了,也有错误啊,能不能给我一个运行通过的代码啊
create or replace view TableA as
select *
from TableA@PM
这个代码我也试了,不过@PM系统好像不认啊,我是一个超级菜鸟,麻烦你们给我一个全点地代码,谢谢

你这个问题和具体数据库相关,建议你尽量使用远程视图之类的数据库功能。

create trigger TRIGER_TABLE_A_insert
before insert
on TABLE_A
for each row
begin
insert into TABLE_B(FIELD_B_1,FIELD_B_2,FIELD_B_3)
values(:New.FIELD_A_1,:New.FIELD_A_2,:New.FIELD_A_3);
end;

create trigger TRIGER_TABLE_A_update
before update
on TABLE_A
for each row
begin
update TABLE_B
set FIELD_B_1=:New.FIELD_A_1
, FIELD_B_2=:New.FIELD_A_2
, FIELD_B_3=:New.FIELD_A_3
where KEY_FIELD_B=:old.KEY_FIELD_A
;
end;

create trigger TRIGER_TABLE_A_delete
before delete
on TABLE_A
for each row
begin
delete TABLE_B
where KEY_FIELD_B=:old.KEY_FIELD_A
;
end;

这个问题其实是可以这样解决的:

A电脑用做主机,建表.B电脑用做客房端,不需要建表.建立视图(View)即可.原理是,通过DB_link,A电脑表中的一切都会View到B电脑.A改B也改.这种方法要比触发器+存储过程容易得多,而且对资源的利用也少得多.
(触发器+存储过程)这种方法我试过的.当存储过程有错误时,很容易死机.而且服务器也会受影响.
我们目前这个项目,开始时就用的(触发器+存储过程),现在改为视图了,很方便.具体代码如下:
1.A电脑中,在数据库建立Database links(DB_link).建议用PL/SQL工具,很方便的.是窗口操作,填上所要连接的两台机子的地址即可.假设所建DB_link名字为PM.
2.在B电脑数据库,建立Views(视图),每一个视图的名字可对应A数据库中每一个表的名字即可.
3.设A数据库表一为TableA.B数据库中所建Views名字可为TableA.代码如下:

create or replace view TableA as
select *
from TableA@PM
4.如上所述.A数据库表中有任何改动,B数据库的视图也可以随之改动,但B中的不是表,而是视图了.

引"
问题补充:一楼的代码我试过了,也有错误啊,能不能给我一个运行通过的代码啊
create or replace view TableA as
select *
from TableA@PM
这个代码我也试了,不过@PM系统好像不认啊,我是一个超级菜鸟,麻烦你们给我一个全点地代码,谢谢"

这个方案的可性行就在于"@PM".这是一个DB_link名字.具体操作是:
用PL/SQL Developer ,在主界面下选择"Database links",右键"New...",会出现新建DB_Link界面.里面只要添上所连接数据库的用户名和密码及Database名字.及你本机数据库的用户名和密码即可.在界面左边的"Owner"的下面,有一个"Name"需要填,这里面就填"PM"就可以了.即DB_Link名.如上所说.如果你的DB_Link 要用别的名字,你在视图里也要相应改一下.

create or replace view TableA as
select *
from TableA@PM
这个"PM"就是DB_Link名字了。

就是双机双工的问题,很简单,我们就是这么做的

create trigger TRIGER_TABLE_A_insert
before insert
on TABLE_A
for each row
begin
insert into TABLE_B(FIELD_B_1,FIELD_B_2,FIELD_B_3)
values(:New.FIELD_A_1,:New.FIELD_A_2,:New.FIELD_A_3);
end;

create trigger TRIGER_TABLE_A_update
before update
on TABLE_A
for each row
begin
update TABLE_B
set FIELD_B_1=:New.FIELD_A_1
, FIELD_B_2=:New.FIELD_A_2
, FIELD_B_3=:New.FIELD_A_3
where KEY_FIELD_B=:old.KEY_FIELD_A
;
end;

create trigger TRIGER_TABLE_A_delete
before delete
on TABLE_A
for each row
begin
delete TABLE_B
where KEY_FIELD_B=:old.KEY_FIELD_A
;
end;

同意一楼的

你可以不用这种方法做.用1做服务器.数据备份.2则用做修改.现在好多公司都不像你这样做.