pl sql触发器如何比较触发器中的列值

Posted

技术标签:

【中文标题】pl sql触发器如何比较触发器中的列值【英文标题】:pl sql trigger how to compare column value in trigger 【发布时间】:2015-03-15 03:18:24 【问题描述】:

我想在我的预订表中创建一个 ORACLE plsql 触发器,这将阻止用户更新预订开始日期的值,例如

在我的预订表预订开始日期列名称是 date_from。我尝试了以下命令,但似乎我使用了错误的代码。

    create or replace TRIGGER UPDATE_BOOKING
BEFORE UPDATE ON BOOKING
FOR EACH ROW
BEGIN
    IF BOOKING.DATE_FROM <= TO_DATE(SYSDATE)
       THEN  
        RAISE_APPLICATION_ERROR (-20001,'YOU CAN NOT UPDATE BOOKING STATUS WHERE ......');
    END IF;
END;

实现此触发器的最佳方式是什么。

【问题讨论】:

为什么不使用检查约束,而不是触发器? @DarenBeattie,您不能在普通检查约束中引用非确定性函数(例如 SYSDATE)。 【参考方案1】:

如果要比较日期的现有值,请使用:old。如果您还要更新日期列并且想要检查更新日期的新值,请使用:new:old 的示例如下..

create or replace TRIGGER UPDATE_BOOKING
BEFORE UPDATE ON BOOKING
FOR EACH ROW
BEGIN
    IF :OLD.DATE_FROM <= TO_DATE(SYSDATE)
       THEN  
        RAISE_APPLICATION_ERROR (-20001,'YOU CAN NOT UPDATE BOOKING STATUS WHERE ......');
    END IF;
END;

【讨论】:

【参考方案2】:

sysdate不需要使用to_date()函数,它已经是日期类型,检查以下代码:

create or replace TRIGGER UPDATE_BOOKING
BEFORE UPDATE ON BOOKING
FOR EACH ROW
BEGIN
-- used trunc function below for more accuracy
    IF trunc(:OLD.DATE_FROM) <= trunc(SYSDATE)
       THEN  
        RAISE_APPLICATION_ERROR (-20001,'YOU CAN NOT UPDATE BOOKING STATUS WHERE ......');
    END IF;
END;

【讨论】:

以上是关于pl sql触发器如何比较触发器中的列值的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 如何比较触发器中的表达式?

“如何修复 oracle pl/sql 中的触发器?

更新之前的Oracle SQL触发器,用于设置来自其他实体的列值

如何从 PL/SQL 中的触发器回滚列

PL/SQL:如何启用模式中的所有触发器?

如何通过 PL/SQL 中的触发器发送电子邮件