欢迎来到Oracle专家的世界
在一个Oracle 12数据库中(升级已经安排好了;-)),我们通过“after update”触发器设置不同的表更新一个共同的基本表,如下所示:
Search_Flat | |||
---|---|---|---|
ID | Field_A | Field_B | Field_C |
现在table1包含n列,其中假设有2列与Search_Flat表相关。由于table1的更新可能仅涉及对Seach_Flat无关的列,因此我们想要在触发器中添加检查。因此,我们的第一种方法如下:
CREATE OR REPLACE TRIGGER tr_tbl_1_au_search
AFTER UPDATE OF
field_a,
field_b
ON schemauser.search_flat
FOR EACH ROW
BEGIN
IF :new.field_a <> :old.field_a THEN
UPDATE schemauser.search_flat SET field_a = :new.field_a WHERE id = :new.ID;
END IF;
IF :new.field_b <> :old.field_b THEN
UPDATE schemauser.search_flat SET field_b = :new.field_b WHERE id = :new.ID;
END IF;
END;
或者,我们还可以像以下这样设置触发器:
CREATE OR REPLACE TRIGGER tr_tbl_1_au_search
AFTER UPDATE OF
field_a,
field_b
ON schemauser.search_flat
FOR EACH ROW
BEGIN
IF :new.field_a <> :old.field_a OR :new.field_b <> :old.field_b THEN
UPDATE schemauser.search_flat
SET field_a = :new.field_a,
field_b = :new.field_b
WHERE id = :new.ID;
END IF;
END;
现在的问题是关于触发器本身的设置。哪种方法更好,与以下方面有关:
- 锁定搜索平面行的时间
- 受影响组件的整体性能(即table_1、trigger和search_flat)
在生产中,我们考虑到触发器中涉及了每个表的10个字段。同时,我们有独立的应用服务器访问共享数据库,同时更新这4张表。我们不时会发现以下错误,这也是我们希望优化触发器的原因:
ORA-02049:超时:分布式事务等待锁定
注:由于基础表用于GUI并要求立即更新,而4张供应表的记录数量对于更新材料化视图来说太多了,因此选择了这种设置。
期待您的讨论和想法。