Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Administration
Administration Forum d'entraide sur l'administration du serveur Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/03/2011, 15h09   #1
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
Par défaut trigger pour modifier une valeur après création du record

Bonjour,
Avec une application python travaillant en oracle 10g, A travers une IHM, je saisi des infos correspondant à une table 'AIRPORT', mais des champs mandatory sont cachés : ils vont être créé avec une valeur par défaut pour que le 'insert' se fasse et je compte utiliser le trigger suivant pour remettre la bonne valeur dans ce champ:
Code :
1
2
3
4
5
6
7
CREATE OR REPLACE TRIGGER airport_creation
after INSERT ON airport
FOR each row when (old.aixm_identifier = 'x')
begin
	:new.aixm_identifier := sys_guid();
end;
/
Mais oracle me signale l'erreur suivante:
Code :
ORA-04084: cannot CHANGE NEW VALUES FOR this TRIGGER type
Comment puis je écrire ce trigger ?
Merci
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 15h25   #2
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
Je ne suis pas un expert en triggers mais plusieurs points me paraissent scabreux :

- Tu met une condition sur :old dans un trigger de type "after INSERT". Le :old est il me semble toujours null dans ce cas.

- Tu modifies ton enregistrement après son insertion, et c'est à mon avis cela qui cause l'erreur. Tu devrais utiliser un trigger de type "before INSERT".
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 17h33   #3
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
J'ai essayé avec "before insert", le trigger est effectivement créé, mais il ne se déclenche pas lors de l'ajout d'un record ...
Merci
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 17h47   #4
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
Cf ma première remarque, ton when ne sera jamais évalué à true.

J'imagine que tu veux dire que si le champ aixm_identifier de l'enregistrement à insérer est 'x' alors tu exécutes le trigger ? Dans ce cas il ne faut pas mettre :old mais bien :new.
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 17h59   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Sinon au lieu d'utiliser un déclencheur vous pouvez rajouter une contrainte DEFAULT sur votre table, et ne pas appeler la colonne lors de vos inserts :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE tab
(
    col1    varchar2(32 char) DEFAULT sys_guid() NOT NULL,
    col2    number(1)
);
-- Table created.
 
INSERT INTO tab (col2) VALUES (1);
-- 1 row created.
 
commit;
-- Commit complete.
 
SELECT col1, col2 FROM tab;
 
COL1                                   COL2
-------------------------------- ----------
DAF92FA8B7A44AA1A438014B1F2D1581          1
-- 1 row selected.
 
DROP TABLE tab;
-- Table dropped.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 18h41   #6
Membre confirmé
 
Avatar de awalter1
 
Inscription : août 2004
Messages : 665
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 665
Points : 232
Points : 232
Bravo pour la contrainte DEFAULT que je connaissais pas, cela me simplifie plein de choses.
merci encore
awalter1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h03.


 
 
 
 
Partenaires

Hébergement Web