火鸟 - 破碎的触发器

时间:2011-10-15 19:51:26

标签: sql firebird

我有一个包含两个表的数据库。表ITEMS中的ON INSERT触发器应该将ITEMS.ITEMSIZE的值添加到STATS.SIZE

下面的选择语句是问题所在。如何修改此选项只能获取当前行更新的ITEMSIZE。 BTW STATS表只有一行。

** Tables **

CREATE TABLE ITEMS (
    ID              ID NOT NULL /* ID = VARCHAR(36) NOT NULL */,
    EXPIRYTIME      EXPIRYTIME NOT NULL /* EXPIRYTIME = BIGINT NOT NULL */,
    ITEMSIZE        ITEMSIZE /* ITEMSIZE = BIGINT NOT NULL */,
    ACCESSCOUNT     ACCESSCOUNT DEFAULT 1 NOT NULL /* ACCESSCOUNT = INTEGER DEFAULT 1 NOT NULL */,
    LASTACCESSTIME  LASTACCESSTIME /* LASTACCESSTIME = TIMESTAMP NOT NULL */
);


CREATE TABLE STATS (
    INSTANCE            SMALLINT,
    SIZE                BIGINT DEFAULT 0,
    DISKCACHEITEMCOUNT  BIGINT DEFAULT 0,
    DISKCACHEHITS       BIGINT DEFAULT 0,
    DISKCACHEMISSES     BIGINT DEFAULT 0
);

**触发**

AS
DECLARE ITEM_SIZE bigint;
begin
SELECT ITEMSIZE FROM ITEMS INTO :ITEM_SIZE;
UPDATE STATS SET SIZE = SIZE  + :ITEM_SIZE WHERE INSTANCE = '0';
end

2 个答案:

答案 0 :(得分:1)

用户“mu太短”给了你正确的提示 - 你想在触发器中使用NEW / OLD上下文变量来读取“当前记录”的值。所以你的触发器就像是

CREATE TRIGGER AddItemSize FOR ITEMS
ACTIVE AFTER INSERT POSITION 100
AS
BEGIN
  UPDATE STATS SET SIZE = SIZE + NEW.ITEMSIZE WHERE INSTANCE = 0;
END

答案 1 :(得分:0)

在这种情况下,检查SMALLINT INSTANCE是否为0,但是你写入INSTANCE ='0' - 它检查它是否为'0'值VARCHAR。尝试将其更改为INSTANCE = 0。