Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
je m'explique, je voudrais faire un trigger, qui lors d'une insertion dans une table, récupère quelques informations pour les insérer dans une autre table. J'ai remarqué que lorsque ce trigger plante, l'insertion ne se fait même pas dans la première table.
Et il possible de forcer l'insertion malgré le plantage du trigger ?
Merci de votre aide !
Dernière modification par julien (24-02-2011 07:57:39)
Hors ligne
Bonjour,
julien a écrit:
lorsque ce trigger plante, l'insertion ne se fait même pas dans la première table.
Ca veut dire qu'il fait plusieurs insert ?
Le cas échéant, tu peux toujours mettre un commit après chaque insert, mais c'est pas terrible si t'as besoin du reste...
Essaye plutôt d'intercepter et de gérer les erreurs dans le trigger.
Hors ligne
Non le trigger ne fait qu'un seul insert, je parle de l'insert initial qui déclenche le trigger.
Comment fait on pour intercepter ces erreurs ?
Hors ligne
Bonjour, en ASA j'utilise le code suivant à la fin de mon trigger:
exception when others then leave THE_TRIGGER_NAME
Hors ligne
Ça me fonctionne pas en ASE :
Il met une erreur de compilation.
Hors ligne
Je te donne un exemple complet, mais je n'ai pas trouvé d'info de compatibilité ASE (pour la syntaxe en ASA il faut voir du côté BEGIN statement dans la documentation sur la partie exception)
create table test_table_xlat( id int not null default autoincrement, label varchar(255) null, primary key(id) ); create table test_table_xlat2( id int not null default autoincrement, label varchar(255) null, primary key(id) ); create trigger ttxlat_trig before insert on test_table_xlat referencing new as new_data for each row begin message '** got label'+new_data.label to client; insert into test_table_xlat2 values(1,'premier2'); exception when others then message '** got an error' to client; leave ttxlat_trig; end; commit; insert into test_table_xlat(label) values('premier1'); --Marche bien, pas encore de doublon dans la table test_table_xlat2 insert into test_table_xlat(label) values('premier2'); --Erreur d'insertion dans la table test_table_xlat2, mais continue l'insert sur test_table_xlat --select * from test_table_xlat; --select * from test_table_xlat2; drop table test_table_xlat; drop table test_table_xlat2;
Hors ligne
C'est pas en testant la valeur de @@error ?
if @@error <> 0 begin /* traitement */ end
Hors ligne
D'après ma documentation :
Guide de l'utilisateur Transact-SQL v12.5 a écrit:
Le trigger et l'instruction qui le déclenche sont traités en une seule transaction qui peut être annulée à partir du trigger.
Je dirais donc a priori que non, ce n'est pas possible de forcer l'insertion. Si tu veux vraiment insister, il y a peut-être moyen de faire chelque chose en regardant du côté de
alter table [nom_basededonnées.[nom_propriétaire].]nom_table {enable | disable } trigger [nom_trigger]
Mais personnellement, je ne m'y risquerais pas.
Hors ligne
Bonjour,
J'ai eu à résoudre le problème inverse il y a déjà quelques temps, c'est à dire si l'insertion échoue dans le trigger l'insert qui a déclenché le trigger ne doit pas être annulé :
create trigger dbo.trg_demo on dbo.enumeres for insert as begin save transaction beforetrigger /* Génére une erreur duplicate key */ insert into pays values('FRA','France') if (@@error != 0) begin rollback transaction beforetrigger end commit transaction end
Je me demande si dans ton cas, cette syntaxe ne fonctionnerait pas :
create trigger dbo.trg_demo on dbo.enumeres for insert as begin if (@@error != 0) begin rollback transaction end insert into pays values('FRA','France') commit transaction end
Hors ligne
Merci ca fonctionne !
Hors ligne