插入或更新的值过高或过低时的 SQL 触发器
Posted
技术标签:
【中文标题】插入或更新的值过高或过低时的 SQL 触发器【英文标题】:SQL Trigger for when a inserted or updated value is too high or low 【发布时间】:2021-03-03 19:57:09 【问题描述】:我正在尝试创建一个在插入或更新的汽车价格过高或过低时运行的触发器。 在尝试编译时,它只是说必须在我使用或看到的其他类似方法使用相同方法的地方声明标识符。
CREATE OR REPLACE TRIGGER carlistprice_insert_update
BEFORE INSERT OR UPDATE ON car
FOR EACH ROW
WHEN (NEW.carlistprice < 0 OR NEW.carlistprice > 250000)
BEGIN
IF NEW.carlistprice < 0 THEN
:NEW.carlistprice := 0;
END IF;
IF NEW.carlistprice > 250000 THEN
:NEW.carlistprice := 250000;
END IF;
END;
/
我的这个程序基于这段代码,它可以工作并且不需要声明标识符。
CREATE OR REPLACE TRIGGER cust_before_insert
BEFORE INSERT ON customer
FOR EACH ROW
WHEN(NEW.custname != UPPER(NEW.custname))
BEGIN
:NEW.custname := UPPER(:NEW.custname);
END;
/
carlistprice 是我的一张表中的有效列
【问题讨论】:
【参考方案1】: 在WHEN
子句中,NEW
(以及OLD
)没有冒号。
其他地方必须以冒号开头
所以:
CREATE OR REPLACE TRIGGER carlistprice_insert_update
BEFORE INSERT OR UPDATE ON car
FOR EACH ROW
WHEN (NEW.carlistprice < 0 OR NEW.carlistprice > 250000) -- no colon here
BEGIN
IF :NEW.carlistprice < 0 THEN -- colon here
:NEW.carlistprice := 0; -- and here
END IF;
IF :NEW.carlistprice > 250000 THEN -- and here
:NEW.carlistprice := 250000; -- and here
END IF;
END;
/
【讨论】:
我非常接近,感谢您指出这一点。感谢您的回复! 请注意,这通常会使最终用户感到困惑,因为他们在屏幕上输入 26,000,然后返回 25,000。如果您在前端也有验证,那么也许不是触发器,更好的数据库方法不是触发器,而是确保没有任何东西漏掉的约束,即alter table car add constraint car_chk check ( carlistprice between 0 and 25000 )
以上是关于插入或更新的值过高或过低时的 SQL 触发器的主要内容,如果未能解决你的问题,请参考以下文章