这个触发器写对了吗?我希望它能防止amount或pricenet为零。这些列被定义为具有十进制数据类型的域。
CREATE OR ALTER trigger invpos_biu0 for invpos
active before insert or update position 0
AS
begin
IF('INVPOS.AMOUNT' = '0.00' or 'INVPOS.PRICENET' = '0.00')
THEN exception zero_value;
end
我使用ibeexpert如果它是相关的。当我插入0值的数据时,它没有反应
您的触发器正在比较字符串(CHAR
) 'INVPOS.AMOUNT'
到'0.00'
和'INVPOS.PRICENET'
到'0.00'
。这些比较的结果总是false,因此不会引发异常。
您显然想比较列的(新)值。当您使用触发器时,您可以使用NEW
上下文变量(它包含表的所有列)检索新值,并使用OLD
上下文变量检索旧值。
我认为你想要条件:
IF(NEW.AMOUNT = '0.00' or NEW.PRICENET = '0.00')
或者如果这些值是DOUBLE PRECISION
, NUMERIC
或DECIMAL
:
IF(NEW.AMOUNT = 0.00 or NEW.PRICENET = 0.00)
也就是说:您应该在AMOUNT
和PRICENET
列上使用CHECK
约束而不是触发器。这比触发要清晰得多。
在Firebird中你可以使用列和表级别的检查约束,例如:
CREATE TABLE INVPOS (
...,
CONSTRAINT CHK_INVPOS_NONZERO CHECK (AMOUNT <> 0 OR PRICENET <> 0)
)
或
CREATE TABLE INVPOS (
...,
AMOUNT DECIMAL(6,2) NOT NULL CHECK (AMOUNT <> 0),
PRICENET DECIMAL(6,2) NOT NULL CHECK (PRICENET <> 0),
...
)
注意,您还可以命名约束,这更便于错误处理。参考Firebird 2.5 Language Reference, CREATE TABLE