0

大家好,我在触发器方面有点菜鸟,所以我只是在寻找一些关于如何执行跟随触发器的建议。

我创建了一个触发器,如果​​有人在办公时间删除记录,它将引发错误消息,但是我想创建另一个使用 SYSDATE 的触发器不会删除今天和未来日期的记录。

我在考虑可能使用 >=SYSDATE 但我不确定这是否是有效的 sql 语句。

CREATE OR REPLACE TRIGGER records_delete 
BEFORE DELETE 
ON RECORDS FOR EACH ROW 
BEGIN 
    IF TO_CHAR(SYSDATE, 'HH24MI') NOT >= sysdat 
       RAISE_APPLICATION_ERROR(-20669, 'You can not delete current or future records'); 
    END IF; 
END records_delete;

谢谢,小妖精

4

1 回答 1

1

这里的问题是您没有引用要从中删除的表的任何字段。

如果您的表有一个名为 record_date 的列,那么您可以将其重写为:

CREATE OR REPLACE TRIGGER records_delete 
BEFORE DELETE 
ON RECORDS FOR EACH ROW 
BEGIN 
    IF (:old.record_date >= SYSDATE) THEN
       RAISE_APPLICATION_ERROR(-20669, 'You can not delete current or future records'); 
    END IF; 
END records_delete;

语法:旧。和:新。是您如何使用 :old 引用触发器所作用的当前记录的列的方式。是在触发器作用于它之前检查值的前缀和 :new。触发完成后的值。此语法允许您在触发器更新数据之前/之后查看值,这在您的情况下并不重要,因为您正在删除记录。

如果您想忽略日期字段的小时、分钟、秒,请在 IF 语句中使用它

trunc(:old.record_date) >= trunc(SYSDATE)

如果 record_date 实际上存储为字符串而不是日期,则在比较之前将其转换为日期:

to_date(:old.record_date, 'DDMMYYYY') >= trunc(SYSDATE)

将格式掩码“DDMMYYYY”更新为实际存储日期的格式。查看 Oracle 文档以了解 to_date 和日期格式模型的描述。

试一试,看看它是否有效。

于 2015-04-10T19:22:32.540 回答