Powerbuilder pour les completement Geeks !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 08-02-2011 14:31:57

julien  
Membre completement Geek
Date d'inscription: 02-09-2008
Messages: 127
Pépites: 10,665
Banque: 0

[RESOLU] Détecter le plantage d'un trigger en ASE

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

 

#2 08-02-2011 14:42:19

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Détecter le plantage d'un trigger en ASE

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.


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 08-02-2011 14:49:16

julien  
Membre completement Geek
Date d'inscription: 02-09-2008
Messages: 127
Pépites: 10,665
Banque: 0

Re: [RESOLU] Détecter le plantage d'un trigger en ASE

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

 

#4 08-02-2011 15:32:30

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Détecter le plantage d'un trigger en ASE

Bonjour, en ASA j'utilise le code suivant à la fin de mon trigger:

Code: sql

exception 
  when others then leave THE_TRIGGER_NAME

https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#5 09-02-2011 07:46:40

julien  
Membre completement Geek
Date d'inscription: 02-09-2008
Messages: 127
Pépites: 10,665
Banque: 0

Re: [RESOLU] Détecter le plantage d'un trigger en ASE

Ça me fonctionne pas en ASE :

Il met une erreur de compilation.

Hors ligne

 

#6 09-02-2011 08:40:35

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: [RESOLU] Détecter le plantage d'un trigger en ASE

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)

Code: sql

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;

https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#7 09-02-2011 10:13:25

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Détecter le plantage d'un trigger en ASE

C'est pas en testant la valeur de @@error ?

Code: mssql

if @@error <> 0
  begin

    /* traitement */

  end

N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#8 09-02-2011 14:17:23

FMolinas  
Membre Geek
Lieu: Lyon
Date d'inscription: 12-06-2007
Messages: 87
Pépites: 97
Banque: 6,435,474,948,567

Re: [RESOLU] Détecter le plantage d'un trigger en ASE

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

Code:

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

 

#9 09-02-2011 15:49:01

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Détecter le plantage d'un trigger en ASE

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é :

Code: sql

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 :

Code: sql

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

 

#10 24-02-2011 07:57:20

julien  
Membre completement Geek
Date d'inscription: 02-09-2008
Messages: 127
Pépites: 10,665
Banque: 0

Re: [RESOLU] Détecter le plantage d'un trigger en ASE

Merci ca fonctionne !

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22