使用触发器实现本地表的同步和日志记录

---使用触发器实现本地表的同步和日志记录
--知识点:触发器trigger,存储过程proc

--基本查看sql
select * from user_tables --查看所有的表
select * from user_triggers --查看所有的触发器。
select * from USER_PROCEDURES --查看所有的存储过程。

 

--1.1.建表TEST(需要同步的表)
-------------------------------------------------------------------
--drop table Test --删除表。
--select * from test --查看表数据
--delete  from test --清空表数据
create table TEST
(
  T_ID   NUMBER(4),
  T_NAME VARCHAR2(20),
  T_AGE  NUMBER(2),
  T_SEX  CHAR(1)
);
--1.2建表TEST_BACK(与test表同步的表)

create table TEST_BACK
(
  T_ID   NUMBER(4),
  T_NAME VARCHAR2(20),
  T_AGE  NUMBER(2),
  T_SEX  CHAR(1)
);
--1.3 日志表。
create table LOG_TEST
(
  L_USER VARCHAR2(15),
  L_TYPE VARCHAR2(15),
  L_DATE VARCHAR2(30)
);

-------------------------------------------------------------------
--2.建立与B对应的DBLINK
-------------------------------------------------------------------
--drop public database link mydblink;
--Create public DATABASE LINK mydblink CONNECT TO zddxgltest IDENTIFIED BY PW123456 USING '172.16.17.7:1521/orcl';
------------------------------------------------------------------


--3.建立触发器
------------------------------------------------------------------
--开启屏幕监听:
--sql>set serveroutput on;
CREATE OR REPLACE TRIGGER test_trigger
AFTER DELETE OR INSERT OR UPDATE ON test for each row -- for each row是为了使用:new和old
DECLARE
v_type VARCHAR2(15);
BEGIN
IF INSERTING THEN
  v_type := 'INSERT '||:new.T_ID;--oracle添加链接字符串使用||
  DBMS_OUTPUT.PUT_LINE('记录'||:new.T_ID||'已经成功插入,并已记录到日志');--添加 只有new
  INSERT INTO TEST_BACK VALUES(:new.T_ID,:new.T_NAME,:new.T_AGE,:new.T_SEX);--同步表。
ELSIF UPDATING THEN
  v_type := 'UPDATE '||:old.T_ID;
  DBMS_OUTPUT.PUT_LINE('记录'||:old.T_ID||'已经成功更新,并已记录到日志');--更新有new和old
  UPDATE TEST_BACK T SET T.T_NAME = :new.T_NAME,T.T_AGE = :new.T_AGE,T.T_SEX =:new.T_SEX where T.T_ID = :old.T_ID;--注意末尾的;号
ELSIF DELETING THEN
  v_type := 'DELETE '||:old.T_ID;
  DBMS_OUTPUT.PUT_LINE('记录'||:old.T_ID||'已经成功删除,并已记录到日志');--删除只有old
  DELETE FROM TEST_BACK T where T.T_ID = :old.T_ID;--注意末尾的;号
 
END IF;
 my_pro(v_type);--记录日志。
END;
------------------------------------------------------------------


----------------------------------------------------------------
--2.建存储过程(注意一定要加上PRAGMA AUTONOMOUS_TRANSACTION;让这个存储过程有自治的事务控制,不然会影响A的事务控制)
----------------------------------------------------------------
create or replace procedure my_pro(v_type varchar2)
as
PRAGMA AUTONOMOUS_TRANSACTION;
begin
INSERT INTO LOG_TEST VALUES(user,v_type,TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss'));--操作日志。
commit;
end;
---------------------------------------------------------------

--最后我们在A中输入以下测试语句:
INSERT INTO test VALUES(34,'zhao',22,'M');
UPDATE test SET t_name = '3ddd0' WHERE t_id = 34;
DELETE test WHERE t_id = 34;

SELECT * FROM test;
SELECT * FROM LOG_TEST;
SELECT * FROM TEST_BACK;

 

 

 

你可能感兴趣的:(oracle,sql)