如何在Oracle中更新触发器

时间:2017-02-16 10:35:25

标签: oracle triggers

我创建了一个类似的触发器:

create or replace
 TRIGGER "TRIG_DECLENCHEMENT_PARAM"
 AFTER UPDATE ON t_balise
 FOR EACH ROW
WHEN (NEW.no_serie like '2%')
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  P_UPDATE_BALISE(:NEW.no_serie, :NEW.date, :NEW.vitesse);
 COMMIT;
END;

P_UPDATE_BALISE这是另一个数据库中更新另一个表的方法。它运作良好。我想更新此触发器并将条件NEW.no_serie like '2%'更改为NEW.no_serie between 200 and 299。有一个类似Alter Trigger...的脚本可以更新Trigger吗?

1 个答案:

答案 0 :(得分:1)

The alter trigger statement只允许您启用,禁用或编译数据库触发器"。文档说明:

  

注意:
  此语句不会更改现有触发器的声明或定义。要重新声明或重新定义触发器,请使用带有OR REPLACE关键字的CREATE TRIGGER语句。

您必须修改现有的声明(无论如何应该在源控制中)以获得新的条件:

create or replace
 TRIGGER "TRIG_DECLENCHEMENT_PARAM"
 AFTER UPDATE ON t_balise
 FOR EACH ROW
WHEN (NEW.no_serie between 200 and 299)
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  P_UPDATE_BALISE(:NEW.no_serie, :NEW.date, :NEW.vitesse);
 COMMIT;
END;

您已将该比较从字符串更改为数字。希望no_serie实际上是一个数字,这是旧的检查错误地将其视为字符串,并触发您不想要的值(2,20,2000等)。

不直接相关,但将此触发器作为自主事务处理意味着如果t_balise上的更新被回滚,则对P_UPDATE_BALISE的调用所做的任何更改都将回滚 - 因为他们已经独立承诺。这通常不是你想要的东西 - 这个表上的更新和其他地方的更改(你说另一个表;希望你没有把这个变成自治的,因为程序实际上是在更新 table)通常是原子的,是同一事务的一部分。打破原子性是非常需要或不可取的事情,所以我要检查这是否是你想要的,而不仅仅是为了避免更深层次的问题。