ouai je sais mais l'avantage c'est que c'est valable quelque soit le language, par exemple en cobol, sans les outils de debug, c'etait plein de "display" et de commentaires pour trouvé le bugEnvoyé par Fred_D
ouai je sais mais l'avantage c'est que c'est valable quelque soit le language, par exemple en cobol, sans les outils de debug, c'etait plein de "display" et de commentaires pour trouvé le bugEnvoyé par Fred_D
Delphi 2009 - ZeosLib - DevExpress - TMS - PgDAC
PostgreSQL 8.4 sous Debian
Sites : http://postgresql.developpez.com http://dgriessinger.developpez.com
Bon je crois que je vais finir par m'ennerver. J'ai quasiment tout supprimé de mon trigger et il y a toujours le même problème.
Il ne me reste plus queJe suis complètement perdu!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 CREATE OR REPLACE TRIGGER TEST_ADMIN.MINFORIBTRIGGER BEFORE INSERT OR DELETE OR UPDATE ON TEST_ADMIN.MINFORIB REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW WHEN (1 = 1) BEGIN -- Insertion dans la table de suivi INSERT INTO UTMR_SUIVIRIB (SRIB_NO, SRIB_RIB_NOPK, SRIB_BNQ_ETAB, SRIB_BNQ_GUIC, SRIB_IBQ_CODE, SRIB_TITUL, SRIB_NOCPTE, SRIB_CLE, SRIB_TYPE, SRIB_MAJ_ID, SRIB_MAJ_DT, SRIB_DAT_INCID DATE) VALUES(:new.RIB_NO_PK, :new.RIB_BNQ_ETAB, :new.RIB_BNQ_GUIC, :new.RIB_IBQ_CODE, :new.RIB_TITUL,:new.RIB_NOCPTE, :new.RIB_CLE, :new.RIB_TYPE, :new.MAJ_ID, :new.MAJ_DT, :new.RIB_DAT_INCID ) END;
Voilà des exemples qui peuvent aider, à adapter en fonction des tables utilisées :
Tout d'abord, je déclare une table et une table de suivi :
Ensuite, je déclare 3 triggers pour faire les insertions dans la table suivi_toto1 (avec la clause declare pour Fred_d ). Au lieu de passer par les variables Tmp, on pourrait mettre la référence :old ou :new directement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 test@BROCANTE> create table toto1 (id number, texte char(50)); Table crÚÚe. test@BROCANTE> create table suivi_toto1(id number, texte char(50), action char(10)); Table crÚÚe.
Insertions dans la table toto1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 CREATE OR REPLACE TRIGGER test.montrigger BEFORE DELETE ON TEST.toto1 REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW declare TmpId number; TmpTexte char(50); BEGIN TmpId := :old.id; TmpTexte := :old.texte; insert into suivi_toto1 values (TmpId, TmpTexte, 'DELETE'); END; CREATE OR REPLACE TRIGGER test.montrigger2 BEFORE UPDATE ON TEST.toto1 REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW declare TmpId number; TmpTexte char(50); BEGIN TmpId := :old.id; TmpTexte := :old.texte; insert into suivi_toto1 values (TmpId, TmpTexte, 'UPDATE'); END; CREATE OR REPLACE TRIGGER test.montrigger3 BEFORE INSERT ON TEST.toto1 REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW declare TmpId number; TmpTexte char(50); BEGIN TmpId := :new.id; TmpTexte := :new.texte; insert into suivi_toto1 values (TmpId, TmpTexte, 'INSERT'); END;
Update de la table toto1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 test@BROCANTE> insert into toto1 values(1, 'Texte 1'); 1 ligne crÚÚe. test@BROCANTE> insert into toto1 values (2, 'Texte 2'); 1 ligne crÚÚe. test@BROCANTE> commit; Validation effectuÚe. test@BROCANTE> select * from suivi_toto1; ID TEXTE ACTION ---------- -------------------------------------------------- ---------- 1 Texte 1 INSERT 2 Texte 2 INSERT test@BROCANTE> select * from toto1; ID TEXTE ---------- -------------------------------------------------- 1 Texte 1 2 Texte 2
On voit que si je fait 2 update, j'ai bien mes 2 lignes dans la table de suivi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 test@BROCANTE> insert into toto1 values (3, 'Texte 3'); 1 ligne crÚÚe. test@BROCANTE> update toto1 set id=3 where id=2; 1 ligne mise Ó jour. test@BROCANTE> commit; Validation effectuÚe. test@BROCANTE> select * from suivi_toto1; ID TEXTE ACTION ---------- -------------------------------------------------- ---------- 1 Texte 1 INSERT 2 Texte 2 INSERT 3 Texte 3 INSERT 2 Texte 2 UPDATE test@BROCANTE> update toto1 set texte = 'Texte 4' where id=3; 2 ligne(s) mise(s) Ó jour. test@BROCANTE> commit; Validation effectuÚe. test@BROCANTE> select * from suivi_toto1; ID TEXTE ACTION ---------- -------------------------------------------------- ---------- 1 Texte 1 INSERT 2 Texte 2 INSERT 3 Texte 3 INSERT 2 Texte 2 UPDATE 3 Texte 2 UPDATE 3 Texte 3 UPDATE 6 ligne(s) sÚlectionnÚe(s).
Suppression de lignes :
Pareil que pour l'insert, je supprime 2 ligne, j'ai 2 actions dans ma table de suivi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 test@BROCANTE> delete from toto1 where id=3; 2 ligne(s) supprimÚe(s). test@BROCANTE> select * from toto1; ID TEXTE ---------- -------------------------------------------------- 1 Texte 1 test@BROCANTE> commit; Validation effectuÚe. test@BROCANTE> select * from suivi_toto1; ID TEXTE ACTION ---------- -------------------------------------------------- ---------- 1 Texte 1 INSERT 2 Texte 2 INSERT 3 Texte 3 INSERT 2 Texte 2 UPDATE 3 Texte 2 UPDATE 3 Texte 3 UPDATE 3 Texte 4 DELETE 3 Texte 4 DELETE 8 ligne(s) sÚlectionnÚe(s).
il ne manquerait pas grand chose pour nous proposer un tutoriel à publier
Merci CD je vais essayer de reprendre mon trigger avec ce que tu m'as donné.
Je vous tiendrais au courant.
J'ai oublié l'histoire de rollback aussi... Il est géré par dans trigger par Oracle :
La modification annulée dans toto1 l'est bien aussi dans suivi_toto1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 test@BROCANTE> insert into toto1 values (5, 'Texte 5 pour rollback'); 1 ligne crÚÚe. test@BROCANTE> select * from toto1; ID TEXTE ---------- -------------------------------------------------- 1 Texte 1 5 Texte 5 pour rollback test@BROCANTE> select * from suivi_toto1; ID TEXTE ACTION ---------- -------------------------------------------------- ---------- 1 Texte 1 INSERT 2 Texte 2 INSERT 3 Texte 3 INSERT 2 Texte 2 UPDATE 3 Texte 2 UPDATE 3 Texte 3 UPDATE 3 Texte 4 DELETE 3 Texte 4 DELETE 5 Texte 5 pour rollback INSERT 9 ligne(s) sÚlectionnÚe(s). test@BROCANTE> rollback; Annulation (ROLLBACK) effectuÚe. test@BROCANTE> select * from suivi_toto1; ID TEXTE ACTION ---------- -------------------------------------------------- ---------- 1 Texte 1 INSERT 2 Texte 2 INSERT 3 Texte 3 INSERT 2 Texte 2 UPDATE 3 Texte 2 UPDATE 3 Texte 3 UPDATE 3 Texte 4 DELETE 3 Texte 4 DELETE 8 ligne(s) sÚlectionnÚe(s).
Sinon, pour le tutoriel, je pensais déjà essayer de me tester sur la FAQ pour quelques petits points qui reviennent souvent, comme le formatage de l'affichage sous SQL*Plus, je ne l'ai pas vu je crois (j'ai peut être mal lu aussi...)
Bonjour,
Ca ne marche toujours pas. Lors d'un test j'ai l'erreur suivant :Voici mon trigger :ORA-04098: Déclencheur 'TEST_ADMIN.MINFORIBTRUPDATE' non valide. Echec de la revalidationEnsuite voici la table MINFORIB :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 CREATE OR REPLACE TRIGGER TEST_ADMIN.MINFORIBTrUpdate BEFORE UPDATE ON TEST_ADMIN.MINFORIB REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW declare TmpRib_no_pk number; TmpRib_bnq_etab varchar(5); TmpRib_bnq_guic varchar(5); TmpRib_ibq_code number; TmpRib_titul varchar(25); TmpRib_nocpte varchar(11); TmpRib_cle number; TmpRib_type char(1); TmpMaj_id varchar(4); TmpMaj_dt date; TmpRib_dat_incid date; BEGIN TmpRib_no_pk := :old.RIB_NO_PK; TmpRib_bnq_etab := :old.RIB_BNQ_ETAB; TmpRib_bnq_guic := :old.RIB_BNQ_GUIC; TmpRib_ibq_code := :old.RIB_IBQ_CODE; TmpRib_titul := :old.RIB_TITUL; TmpRib_nocpte := :old.RIB_NOCPTE; TmpRib_cle := :old.RIB_CLE; TmpRib_type := :old.RIB_TYPE; TmpMaj_id := :old.MAJ_ID; TmpMaj_dt := :old.MAJ_DT; TmpRib_dat_incid := :old.RIB_DAT_INCID, INSERT INTO UTMR_SUIVIRIB VALUES (TmpRib_no_pk,TmpRib_bnq_etab,TmpRib_bnq_guic,TmpRib_ibq_code,TmpRib_titul, TmpRib_nocpte,TmpRib_cle,TmpRib_type,TmpMaj_id,TmpMaj_dt,TmpRib_dat_incid, 'UPDATE'); END;
Et enfin ma table UTMR_SUIVIRIB :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 MINFORIB ( RIB_NO_PK NUMBER(*) NOT NULL, RIB_BNQ_ETAB VARCHAR2(5) NOT NULL, RIB_BNQ_GUIC VARCHAR2(5) NOT NULL, RIB_IBQ_CODE NUMBER(3, 0), RIB_TITUL VARCHAR2(25) NOT NULL, RIB_NOCPTE VARCHAR2(11) NOT NULL, RIB_CLE NUMBER(2, 0) NOT NULL, RIB_TYPE CHAR(1) DEFAULT 'T' NOT NULL, MAJ_ID VARCHAR2(4) NOT NULL, MAJ_DT DATE NOT NULL, RIB_DAT_INCID DATE )
Je ne vois pas ou est l'erreur... En fait je n'y vois plus rien....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 UTMR_SUIVIRIB ( RIB_NO_PK NUMBER(*) NOT NULL, RIB_BNQ_ETAB VARCHAR2(5) NOT NULL, RIB_BNQ_GUIC VARCHAR2(5) NOT NULL, RIB_IBQ_CODE NUMBER(3, 0), RIB_TITUL VARCHAR2(25) NOT NULL, RIB_NOCPTE VARCHAR2(11) NOT NULL, RIB_CLE NUMBER(2, 0) NOT NULL, RIB_TYPE CHAR(1) DEFAULT 'T' NOT NULL, MAJ_ID VARCHAR2(4) NOT NULL, MAJ_DT DATE NOT NULL, RIB_DAT_INCID DATE, SRIB_TYPACT VARCHAR2(25) NOT NULL )
Veuillez bien suivre les réponses, c'est pénible de répéter tout le temps la même chose
IL NE FAUT PAS DE DECLARE !
Et show err ou show error permet d'indiquer l'erreur.
Si j'enlève toutes les déclaration j'ai toujours la même erreur.
Ensuite lene m'indique rien...
Code : Sélectionner tout - Visualiser dans une fenêtre à part show errors;
Je m'excuse d'être aussi bête mais là je saisi pas tout.
*soupir*
Que donne ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 CREATE OR REPLACE TRIGGER TEST_ADMIN.MINFORIBTrUpdate BEFORE UPDATE ON TEST_ADMIN.MINFORIB REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW TmpRib_no_pk number; TmpRib_bnq_etab varchar(5); TmpRib_bnq_guic varchar(5); TmpRib_ibq_code number; TmpRib_titul varchar(25); TmpRib_nocpte varchar(11); TmpRib_cle number; TmpRib_type char(1); TmpMaj_id varchar(4); TmpMaj_dt date; TmpRib_dat_incid date; BEGIN TmpRib_no_pk := :old.RIB_NO_PK; TmpRib_bnq_etab := :old.RIB_BNQ_ETAB; TmpRib_bnq_guic := :old.RIB_BNQ_GUIC; TmpRib_ibq_code := :old.RIB_IBQ_CODE; TmpRib_titul := :old.RIB_TITUL; TmpRib_nocpte := :old.RIB_NOCPTE; TmpRib_cle := :old.RIB_CLE; TmpRib_type := :old.RIB_TYPE; TmpMaj_id := :old.MAJ_ID; TmpMaj_dt := :old.MAJ_DT; TmpRib_dat_incid := :old.RIB_DAT_INCID; INSERT INTO UTMR_SUIVIRIB VALUES (TmpRib_no_pk,TmpRib_bnq_etab,TmpRib_bnq_guic,TmpRib_ibq_code,TmpRib_titul, TmpRib_nocpte,TmpRib_cle,TmpRib_type,TmpMaj_id,TmpMaj_dt,TmpRib_dat_incid, 'UPDATE'); END; show err
ou plus simplement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE OR REPLACE TRIGGER TEST_ADMIN.MINFORIBTrUpdate BEFORE UPDATE ON TEST_ADMIN.MINFORIB REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW BEGIN INSERT INTO UTMR_SUIVIRIB VALUES (:old.RIB_NO_PK,:old.RIB_BNQ_ETAB,:old.RIB_BNQ_GUIC,:old.RIB_IBQ_CODE,:old.RIB_TITUL, :old.RIB_NOCPTE,:old.RIB_CLE,:old.RIB_TYPE,:old.MAJ_ID,:old.MAJ_DT,:old.RIB_DAT_INCID, 'UPDATE'); END; show err
je viens de voir :
avec un ; à la place de , ça devrait aller mieux
Code : Sélectionner tout - Visualiser dans une fenêtre à part TmpRib_dat_incid := :old.RIB_DAT_INCID,
PS : c'est le dernier sujet, débuggage auquel tu auras droit conformément aux régles du forum.
Je suis désolée mais j'ai toujours le même problème et lene me donne pas d'infos.
Code : Sélectionner tout - Visualiser dans une fenêtre à part show err
Je m'excuse d'insister mais je suis perdue.
Bon, on reprend alors... J'ai testé ton trigger, il marche si on corrige la faute de frappe.
Essaye d'exécuter cela sous SQL*Plus :
S'il ne fait rien, il faut valider le trigger en donnant la commande suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 CREATE OR REPLACE TRIGGER TEST_ADMIN.MINFORIBTrUpdate BEFORE UPDATE ON TEST_ADMIN.MINFORIB REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW declare TmpRib_no_pk number; TmpRib_bnq_etab varchar(5); TmpRib_bnq_guic varchar(5); TmpRib_ibq_code number; TmpRib_titul varchar(25); TmpRib_nocpte varchar(11); TmpRib_cle number; TmpRib_type char(1); TmpMaj_id varchar(4); TmpMaj_dt date; TmpRib_dat_incid date; BEGIN TmpRib_no_pk := :old.RIB_NO_PK; TmpRib_bnq_etab := :old.RIB_BNQ_ETAB; TmpRib_bnq_guic := :old.RIB_BNQ_GUIC; TmpRib_ibq_code := :old.RIB_IBQ_CODE; TmpRib_titul := :old.RIB_TITUL; TmpRib_nocpte := :old.RIB_NOCPTE; TmpRib_cle := :old.RIB_CLE; TmpRib_type := :old.RIB_TYPE; TmpMaj_id := :old.MAJ_ID; TmpMaj_dt := :old.MAJ_DT; TmpRib_dat_incid := :old.RIB_DAT_INCID; INSERT INTO UTMR_SUIVIRIB VALUES (TmpRib_no_pk,TmpRib_bnq_etab,TmpRib_bnq_guic,TmpRib_ibq_code,TmpRib_titul, TmpRib_nocpte,TmpRib_cle,TmpRib_type,TmpMaj_id,TmpMaj_dt,TmpRib_dat_incid, 'UPDATE'); END;
Sinon, comme le disait Fred_D, l'erreur vient de la ligne où tu déclares TmpRib_Dat_incid := :old.RIB_DAT_INCID. A la fin de la ligne tu as mis une virgule au lieu d'un point-virgule.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SQL> /
Ben même en changant leen,j'avais la même erreur.;
par contre j'ai testé ton code et c'est OK!!!!
Merci beaucoup pour votre aide a vous tous.
Et c'est promi je ne demanderais plus de debuggage.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager