在触发器中使用 Sysdate

Using Sysdate in trigger

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

我创建了一个触发器,如果​​有人在办公时间删除记录,它会抛出一条错误消息,但是我想创建另一个使用 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;

谢谢,leprejohn

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

如果您的 table 有一个名为 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。在触发器完成后用于值。此语法允许您查看触发器更新数据的值 before/after,这在您的情况下无关紧要,因为您正在删除记录。

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

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

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

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

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

试一试,看看是否有效。