下面用oracle数据库进行测试,假设使用这两个表,192.168.2.2服务器上用户test1表LEGAL_CASE,192.168.2.3服务器上用户test密码123456表LEGAL_CASE。
需求:只需改动源库192.168.2.2服务器上的表,目标库192.168.2.3服务器上即可自动改变。
条件:
1.两个表能建立DB LINK,即两个数据库所在的服务器能互相ping通。
2.两个表字段类型必须完全匹配,不能主表某字段能插入字符,而副表对应的某字段只能插入数字,不能主表字段插入的长度超过副表对应字段的最大长度。
下面开始:建立DB LINK和触发器都是在192.168.2.2数据库
1.建立DB LINK,首先判断登录的用户是否有创建DB LINK 的权限,执行以下语句:
-- 查看 test1 用户是否有创建DB LINK 权限
select * from user_sys_privs where privilege like upper('%DATABASE LINK%') AND USERNAME='test1';
如果能查询到结果,说明有权限创建DB LINK ,否则需要管理员角色创建权限(sys或system)
grant create public database link to test1;
也可以用SQL的方式创建:
-- Create database link
create public database link TEST_DBLINK
connect to test2 identified by 123456
using '192.168.2.3:1521/ORCL';
建好DB LINK 后测试一下,看下是否连接上了
SELECT * FROM LEGAL_CASE@TEST_DBLINK;
2.建立好DB LINK 后,就可以写触发器了
CREATE OR REPLACE TRIGGER "TEST_LEGAL_CASE"
AFTER INSERT OR UPDATE OR DELETE ON LEGAL_CASE
FOR EACH ROW
BEGIN
CASE WHEN INSERTING THEN
insert into LEGAL_CASE@TEST_DBLINK(ID,PERSON,CARNO,CREATE_DATE,PLACE,FILE_PATH,NOTES_PATH,STATE,APPLY_ID,SEX,IDCARD,CONTEXT,ADDRESS,CAR_TYPE,USER_ID,USER_NAME,CONTENT,START_DATE,END_DATE,MOBILE,COMPANY,JOB,USER_NO,RECOREDER,GOODS)
values(:NEW.ID,:NEW.PERSON,:NEW.CARNO,:NEW.CREATE_DATE,:NEW.PLACE,:NEW.FILE_PATH,:NEW.NOTES_PATH,:NEW.STATE,:NEW.APPLY_ID,:NEW.SEX,:NEW.IDCARD,:NEW.CONTEXT,:NEW.ADDRESS,:NEW.CAR_TYPE,:NEW.USER_ID,:NEW.USER_NAME,:NEW.CONTENT,:NEW.START_DATE,:NEW.END_DATE,:NEW.MOBILE,:NEW.COMPANY,:NEW.JOB,:NEW.USER_NO,:NEW.RECOREDER,:NEW.GOODS);
WHEN UPDATING THEN
update LEGAL_CASE@TEST_DBLINK set ID=:NEW.ID,PERSON=:NEW.PERSON,CARNO=:NEW.CARNO,CREATE_DATE=:NEW.CREATE_DATE,PLACE=:NEW.PLACE,FILE_PATH=:NEW.FILE_PATH,NOTES_PATH=:NEW.NOTES_PATH,STATE=:NEW.STATE,APPLY_ID=:NEW.APPLY_ID,SEX=:NEW.SEX,IDCARD=:NEW.IDCARD,CONTEXT=:NEW.CONTEXT,ADDRESS=:NEW.ADDRESS,
CAR_TYPE=:NEW.CAR_TYPE,USER_ID=:NEW.USER_ID,USER_NAME=:NEW.USER_NAME,CONTENT=:NEW.CONTENT,START_DATE=:NEW.START_DATE,END_DATE=:NEW.END_DATE,MOBILE=:NEW.MOBILE,COMPANY=:NEW.COMPANY,JOB=:NEW.JOB,USER_NO=:NEW.USER_NO,RECOREDER=:NEW.RECOREDER,GOODS=:NEW.GOODS where ID=:OLD.ID;
WHEN DELETING THEN
delete from LEGAL_CASE@TEST_DBLINK where ID=:OLD.ID;
END CASE;
END;
3.触发器建立好后,改动192.168.2.2服务器上的表,创建、修改和删除数据,都可在192.168.2.3服务器上中看到效果。
update LEGAL_CASE set PERSON='更新测试1' where ID='10000521';
delete from LEGAL_CASE where ID='10000521';