对于某个业务表逻辑比较复杂,修改数据频繁,这时候为了方便开发定位问题,常常对该表的每次修改的数据都保持。我们可以使用另外一张表来记录信息, 一般开发人员会称呼这些表为历史表。
下面举例,私人图书馆的-图书预约记录历史表(这只是举例,因为-图书预约记录不需要历史表的,哈哈)
--图书预约记录历史表【BOOKING_RECORD_HISTORY】
create table SYS.BOOKING_RECORD_HISTORY ( ID_BOOKING_RECORD_HISTORY VARCHAR2(32) NOT NULL, ID_BOOKING_RECORD VARCHAR2(32), CREATED_BY VARCHAR2(100), DATE_CREATED DATE, UPDATED_BY VARCHAR2(100), DATE_UPDATED DATE, DATE_UPDATED_MSEL TIMESTAMP(6) ); -- Add comments to the table comment on table SYS.BOOKING_RRCORD_HISTORY is '历史表'; -- Add comments to the columns comment on column SYS.BOOKING_RRCORD_HISTORY.ID_BOOKING_RRCORD_HISTORY is '历史表主键'; comment on column SYS.BOOKING_RRCORD_HISTORY.ID_BOOKING_RRCORD is 'BOOKING_RRCORD基础表主键'; comment on column SYS.BOOKING_RRCORD_HISTORY.CREATED_BY is '创建人'; comment on column SYS.BOOKING_RRCORD_HISTORY.DATE_CREATED is '创建时间'; comment on column SYS.BOOKING_RRCORD_HISTORY.UPDATED_BY is '创建人'; comment on column SYS.BOOKING_RRCORD_HISTORY.DATE_UPDATED is '更新时间'; comment on column SYS.BOOKING_RRCORD_HISTORY.DATE_UPDATED_MSEL is '修改时间精确到毫秒'; -- CREATE INDEX CREATE UNIQUE INDEX SYS.PK_BOOKING_RRCORD_HISTORY_ID on SYS.BOOKING_RRCORD_HISTORY (ID_BOOKING_RRCORD_HISTORY); -- CREATE/RECREATE PRIMARY, UNIQUE AND FOREIGN KEY CONSTRAINTS ALTER TABLE SYS.BOOKING_RRCORD_HISTORY ADD CONSTRAINT PK_BOOKING_RRCORD_HISTORY_ID PRIMARY KEY (ID_BOOKING_RRCORD_HISTORY) USING INDEX PK_BOOKING_RRCORD_HISTORY_ID;
然后创建触发器,为了方便以后维护,可以加一个判断,当不需要记录历史表时,则跳过该过程。就像一个开挂一样来控制,比如,通过表booking_tr_control来控制,当表中查不到对应的触发器的记录时,则不记录到历史表。
delete from booking_tr_control hu where hu.trigger_name = 'BOOKING_RRCORD_HISTORY_AU' and hu.switch_for = 'BOOKING_RRCORD_HI_AU'; insert into booking_tr_control values('BOOKING_RRCORD_HISTORY_AU','BOOKING_RRCORD_HI_AU','1'); CREATE OR REPLACE TRIGGER MYTRG.BOOKING_RRCORD_HISTORY_AU AFTER INSERT OR UPDATE ON SYS.BOOKING_RRCORD for each row declare v_sqlerrm varchar2(800); v_sqlcode varchar2(6); v_error_comment varchar2(300); v_trigger_user varchar2(30); v_count number; begin select user into v_trigger_user from dual; select count(0) into v_count from booking_tr_control where trigger_name = 'BOOKING_RRCORD_HISTORY_AU' and switch_for = 'BOOKING_RRCORD_HI_AU' and status = '1'; -- trigger 开关 if v_count > 0 then insert into BOOKING_RRCORD_HISTORY (ID_BOOKING_RRCORD_HISTORY, ID_BOOKING_RRCORD, CREATED_BY, DATE_CREATED, UPDATED_BY, DATE_UPDATED, DATE_UPDATED_MSEL) values (sys_guid(), :new.ID_BOOKING_RRCORD, :new.CREATED_BY, :new.DATE_CREATED, :new.UPDATED_BY, :new.DATE_UPDATED, systimestamp); end if; exception when others then v_sqlcode := sqlcode; v_sqlerrm := substr(sqlerrm, 1, 200); insert into tr_error_log (error_no, --系统错误代码 error_message, --系统错误信息 trigger_name, --出错的trigger trigger_user, --出错的用户 trigger_date, --出错的时间 error_comment --出错详细信息 ) values (v_sqlcode, v_sqlerrm, 'BOOKING_RRCORD_HI_AU', v_trigger_user, sysdate, v_error_comment); end; /