2011-10-15 2 views
0

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 
+1

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. –

+0

Je suppose que vous voulez dire quelque chose comme. SELECT new.ITEMSIZE FROM ITEMS INTO: ITEM_SIZE; Même problème. – Canacourse

+0

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. –

Répondre

1

L'utilisateur « mu est trop courte » vous a donné allusion à droite - vous voulez utiliser des variables de contexte nouveau/ancien dans la gâchette pour lire les valeurs du "enregistrement actuel". Donc, votre déclencheur serait quelque chose comme

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

Merci, mais encore une fois, il ne compile pas. "La colonne n'appartient pas à la table référencée Erreur SQL dynamique Code d'erreur SQL = -206 Colonne inconnue INSTANCE A la ligne 6, colonne 75." – Canacourse

+0

Eh bien, avez-vous réellement la colonne nommée "INSTANCE" dans la table STATS? Vérifier l'orthographe. BTW avez-vous utilisé des identifiants cités lorsque vous avez créé la table? Dans ce cas, le nom du champ dans le déclencheur doit également être cité et vous devez utiliser le cas exact que vous avez utilisé dans l'instruction 'CREATE TABLE'. – ain

+0

Désolé l'homme. J'ai fait une erreur que votre code fourni fonctionne. – Canacourse

0

Dans la condition que vous vérifiez si le INSTANCE SMALLINT est 0, mais vous écrivez INSTANCE = « 0 » - qui vérifie si elle est un « VARCHAR-0'valeur. Essayez de le remplacer par INSTANCE = 0.