Жар-птица - Сломанный триггер - PullRequest
0 голосов
/ 15 октября 2011

У меня есть база данных, содержащая две таблицы.Предполагается, что триггер ON INSERT в таблице ITEMS добавляет значение ITEMS.ITEMSIZE к STATS.SIZE

.Как мне изменить это, чтобы получить только ITEMSIZE текущей строки обновляется.Кстати, таблица 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 ]

1 голос
/ 16 октября 2011

Пользователь "mu is too short" дал вам правильный совет - вы хотите использовать контекстные переменные 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
0 голосов
/ 04 июля 2012

В условии вы проверяете, равен ли SMALLINT INSTANCE 0, но вы пишете INSTANCE = '0' - что проверяет, является ли это VARCHAR со значением '0'. Попробуйте изменить его на INSTANCE = 0.

...