我创建了一个类似的触发器:
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吗?
答案 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)通常是原子的,是同一事务的一部分。打破原子性是非常需要或不可取的事情,所以我要检查这是否是你想要的,而不仅仅是为了避免更深层次的问题。