简单的 AIU 触发器不起作用



这个触发器写对了吗?我希望它能防止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, NUMERICDECIMAL:

IF(NEW.AMOUNT = 0.00 or NEW.PRICENET = 0.00)

也就是说:您应该在AMOUNTPRICENET列上使用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

相关内容

  • 没有找到相关文章

最新更新