J'ai une base de données contenant deux tables. Un déclencheur ON INSERT dans Table ITEMS est supposé ajouter la valeur de ITEMS.ITEMSIZE à STATS.SIZEFirebird - Broken Trigger
L'instruction select ci-dessous constitue le problème. Comment puis-je modifier cela pour obtenir uniquement l'ITEMSIZE de la ligne en cours de mise à jour. BTW la table STATS a seulement une seule ligne.
** 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
);
** Trigger **
AS
DECLARE ITEM_SIZE bigint;
begin
SELECT ITEMSIZE FROM ITEMS INTO :ITEM_SIZE;
UPDATE STATS SET SIZE = SIZE + :ITEM_SIZE WHERE INSTANCE = '0';
end
Est-ce que Firebird a 'OLD' et' NEW' pour les anciennes valeurs de lignes et les nouvelles valeurs de lignes dans les triggers? C'est comme ça que ça fonctionne mais je ne connais pas Firebird. –
Je suppose que vous voulez dire quelque chose comme. SELECT new.ITEMSIZE FROM ITEMS INTO: ITEM_SIZE; Même problème. – Canacourse
Peut-être 'UPDATE STATS SET TAILLE = TAILLE + NEW.ITEMSIZE O INST INSTANCE = '0';' fonctionnerait, alors abandonner ': ITEMSIZE' complètement. C'est probablement ce que je ferais dans PostgreSQL ou MySQL. –