如何通过Oracle触发器实现插入table1时同步数据到table2并记录插入时间?
Oracle 触发器实现数据同步与插入时间自动记录
需求回顾
- 向
table1插入数据时,同步将对应id和data插入table2 - 自动给
table1的每条新记录填充insertion_time列的插入时间
解决方案
方案1:拆分两个独立触发器
触发器1:自动填充插入时间
这个行级触发器在插入 table1 前触发,为新行的 insertion_time 赋值当前系统时间:
CREATE OR REPLACE TRIGGER trg_table1_set_insert_time BEFORE INSERT ON table1 FOR EACH ROW BEGIN :NEW.insertion_time := SYSTIMESTAMP; -- 如需秒级精度,可替换为 SYSDATE END; /
触发器2:同步数据到 table2
这个行级触发器在 table1 插入完成后,把新行的 id 和 data 插入 table2:
CREATE OR REPLACE TRIGGER trg_table1_sync_to_table2 AFTER INSERT ON table1 FOR EACH ROW BEGIN INSERT INTO table2(id, data) VALUES(:NEW.id, :NEW.data); END; /
方案2:合并为单个触发器
如果不想维护多个触发器,可以把两个逻辑合并到一个触发器中:
CREATE OR REPLACE TRIGGER trg_table1_insert_and_sync BEFORE INSERT ON table1 FOR EACH ROW BEGIN -- 自动填充插入时间 :NEW.insertion_time := SYSTIMESTAMP; -- 同步插入数据到 table2 INSERT INTO table2(id, data) VALUES(:NEW.id, :NEW.data); END; /
关键注意点
- 若
table2的id是主键或有唯一约束,必须保证table1插入的id在table2中不存在,否则触发器会抛出唯一性冲突异常 SYSTIMESTAMP返回带时区的高精度时间(精确到微秒),SYSDATE仅返回当前日期时间(精确到秒),可根据业务需求选择- 两个方案都是行级触发器(
FOR EACH ROW),确保每一行插入操作都会触发对应逻辑
内容的提问来源于stack exchange,提问作者Ibrahim Khalil
相关产品推荐
相关产品推荐

