大家好,我在谈到触发器时有点像菜鸟,所以我只想找一些关于如何进行跟踪触发的建议。
我已经创建了一个触发器,如果有人要在办公时间内删除记录,则会抛出错误消息但是我想创建另一个使用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
答案 0 :(得分: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”更新为实际存储日期的格式。有关to_date和日期格式模型的说明,请查看Oracle文档。
给它一个镜头,看它是否有效。