Postgres trigger after insert accès à de NOUVEAUX
J'ai un assez simple de déclenchement:
CREATE OR REPLACE FUNCTION f_log_datei()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO logs (aktion, tabelle, benutzer_id) VALUES(TG_OP, 'dateien', NEW.benutzer_id);
END; $$ LANGUAGE 'plpgsql';
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
Mes journaux de la table est la suivante:
CREATE TABLE logs(
id int PRIMARY KEY DEFAULT NEXTVAL('logs_id_seq'),
zeit timestamp DEFAULT now(),
aktion char(6),
tabelle varchar(32),
alt varchar(256),
neu varchar(256),
benutzer_id int references benutzer(id)
);
Après l'insertion de quelque chose dans dateien j'obtiens l'erreur suivante:
ERROR: record "new" is not assigned yet
DETAIL: The tuple structure of a not-yet-assigned record is indeterminate.
CONTEXT: SQL statement "INSERT INTO logs (aktion, tabelle, benutzer_id) VALUES(TG_OP, 'dateien', NEW.benutzer_id)"
PL/pgSQL function "f_log_datei" line 3 at SQL statement
Pourquoi j'ai cette erreur? J'ai regardé dans la documentation, et il semble qu'ils utilisent de nouveaux dans la même manière que je fais.
Vous devez vous connecter pour publier un commentaire.
De la beaux-manuel:
Et de Les Procédures De Déclenchement:
Note ce qu'il dit à propos de la ligne déclencheurs de niveau et au niveau de l'instruction des déclencheurs.
Vous avez une déclaration de niveau de déclenchement:
Au niveau de l'instruction des déclencheurs sont déclenchées une fois par déclaration et d'une instruction peut s'appliquer à plusieurs lignes de sorte que la notion de ligne (qui est ce que
NEW
etOLD
sont environ), il suffit de ne pas s'appliquer.Si vous souhaitez utiliser
NEW
(ouOLD
) dans un déclencheur, alors vous voulez le déclencheur à exécuter pour chaque ligne et cela signifie que vous voulez une ligne de niveau de déclenchement:Je viens de changer
FOR EACH STATEMENT
àFOR EACH ROW
.Votre déclencheur doit également retourner quelque chose:
De sorte que vous devrait
RETURN NEW;
ouRETURN NULL;
dans votre déclencheur. Vous avez un déclencheur AFTER de sorte qu'il n'a pas d'importance qui vous RETOURNENT les utiliser mais j'irais avecRETURN NEW;
.RETURN NEW;
à la fin de la fonction?RETURN
déclaration 🙂RETURN NULL
. postgresql.org/docs/current/plpgsql-trigger.htmlnull
autre que celle de tous les exemples utilisentnull
?NEW
est trompeuse.