如何在Oracle中更新触发器

如何在Oracle中更新触发器,oracle,triggers,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); COMM

我创建了一个这样的触发器:

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_应答器
它是另一个数据库中更新另一个表的方法。这样很好用。我想更新此触发器,并将条件
NEW.no系列(如“2%”)更改为
NEW.no系列(介于200和299之间)。有一个像
Alter Trigger…
这样的脚本可以更新触发器?

只允许您“启用、禁用或编译数据库触发器”。文件规定:

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

您必须修改现有语句(无论如何可能都应该在源代码管理中)以获得新条件:

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\u应答器
上的更新被回滚,则调用
p\u update\u应答器
所做的任何更改都不会回滚,因为它们是独立提交的。这通常不是您想要的—此表上的更新以及其他地方所做的任何更改(您对另一个表说;希望您没有使其自治,因为该过程实际上正在更新同一个表)通常是原子的,并且是同一事务的一部分。打破原子性是很少需要或需要的,因此我会检查这是否真的是您想要的,而不仅仅是为了避免更深层次的问题而进行的黑客攻击。

更改条件并运行DDL?我更喜欢使用
Alter Trigger
这样的脚本,但没有选项允许您更改触发器主体。运行
create或replace
?From Oracle Docs for ALTER TRIGGER“注意:此语句不会更改现有触发器的声明或定义。若要重新声明或重新定义触发器,请将“create TRIGGER statement”与or replace子句一起使用。”
创建或替换
说明了一切-它将用新的PL/SQL代码替换现有触发器。感谢您的回答