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触发器如何比较触发器中的列值的主要内容,如果未能解决你的问题,请参考以下文章