【发布时间】:2021-09-23 20:22:56
【问题描述】:
我想进行一次性导入/导出以将数据从 TableA 复制到 TableB。但是,在一次性导入数据后,我需要使用触发器使表保持同步,直到我们准备好使用新表。
是否可以编写一个触发器,根据 tableA 中时间戳字段的值将数据从一个表复制到另一个表,或者在 systimestamp 上使用条件。属性上的触发器是首选,但如果不可能,那我可以去 systimestamp 吗?
我是 Oracle 的新手,如果有人能帮我想出这样的触发器,我将不胜感激。
TableA
CREATE TABLE user.tableA (
attr1 ... NOT NULL,
attr2 ...,
...,
attrN TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT tableA_PK PRIMARY KEY (attr1) ENABLE
)
user.tableB is the same as user.tableA
需要想出一个触发器来将插入从 TableA 复制到 TableB。 下面的代码需要工作
CREATE TRIGGER user.sync_from_A_to_B
AFTER INSERT ON user.tableA
FOR EACH ROW
BEGIN
if (systimestamp OR attrN >= to_timestamp('2021-07-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
then
INSERT INTO user.tableB
(
attr1,
attr2,
...,
attrN
)
VALUES
(
:new.attr1,
:new.attr1,
:new....,
:new.attrN
)
end if;
END;
/
【问题讨论】:
-
为什么需要检查时间戳? INSERT 触发器只会对当前正在插入 的行触发。这是一个新行,所以只需将其复制到 tableB。另一种解决方案是让 tableB 成为 tableA 的物化视图。
-
物化视图应该完全满足您的需要
-
新表有什么不同?您可能可以使用 dbms_redefinition 从一个表结构迁移到另一个表结构 - 这允许您将列映射在一起并让 Oracle 保证在将新表换成旧表之前同步表。如果您想保留两个表,则物化视图适用于,这听起来不像您所追求的。