【问题标题】:Using Sysdate in trigger在触发器中使用 Sysdate
【发布时间】:2015-04-10 15:50:20
【问题描述】:

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

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

谢谢你,小妖精

【问题讨论】:

  • 您好,对不起,我正在使用 orcale
  • 您当然可以使用带有日期的常规比较运算符,但如果您不分享您的代码或错误消息或描述不当行为,就不可能说出您的触发器出了什么问题。
  • 这里是代码: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;

标签: sql oracle triggers sysdate


【解决方案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 和日期格式模型的说明。

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

【讨论】:

  • 如果我要将记录日期字段编辑为“DDMMYYYY”的日期,我会将触发器编辑为这样的吗? CREATE OR REPLACE TRIGGER records_delete BEFORE DELETE ON RECORDS FOR EACH ROW BEGIN IF (:old.record_date >= SYSDATE, 'DDMMYYY') THEN RAISE_APPLICATION_ERROR(-20669, 'You can not delete current or future records'); END IF; END records_delete;
  • 我更新了答案以包含您的日期存储为 VARCHAR2 的条件
  • 感谢迈克尔的帮助,该字段是日期而不是 VARCHAR2
  • 好的,如果它实际上存储为日期,请使用我的第一种方法。如果这回答了您的问题,请将此问题标记为已回答。
  • 谢谢 Michael 我还有一个问题可以补充,但我不想为它创建一个新问题。假设我想要一个触发器,该触发器在支付表中查找已支付“0”的员工以包括他们的姓名、他们所在的站点、开始日期、主要站点。我该怎么办?
猜你喜欢
  • 1970-01-01
  • 2021-01-11
  • 2011-05-13
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多