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 bug :wink:Citation:
Envoyé par Fred_D
Version imprimable
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 bug :wink:Citation:
Envoyé par Fred_D
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:
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:
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:
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:
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:
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:
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:
Merci CD je vais essayer de reprendre mon trigger avec ce que tu m'as donné. :merci:
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:
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...) :)
pas de problème :ccool:
Bonjour,
Ca ne marche toujours pas. Lors d'un test j'ai l'erreur suivant :Voici mon trigger :Citation:
ORA-04098: Déclencheur 'TEST_ADMIN.MINFORIBTRUPDATE' non valide. Echec de la revalidation
Ensuite voici la table MINFORIB :Code:
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:
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:
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 )
:cry:
Veuillez bien suivre les réponses, c'est pénible de répéter tout le temps la même chose :evil:
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:show errors;
Je m'excuse d'être aussi bête mais là je saisi pas tout.
*soupir*
Que donne ceci :
Code:
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:
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 :roll:Code: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:show err
Je m'excuse d'insister mais je suis perdue.
:D
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:
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:SQL> /
Ben même en changant leenCitation:
,
j'avais la même erreur.Citation:
;
par contre j'ai testé ton code et c'est OK!!!!
Merci beaucoup pour votre aide a vous tous.
:merci:
:calin:
Et c'est promi je ne demanderais plus de debuggage.