IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

[trigger]Probleme d'update sur une table


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 146
    Par défaut [trigger]Probleme d'update sur une table
    Bonjour les experts, aujourd'hui je n'arrive pas a faire ce que je veux avec des triggers ce qui est bien ennuyeu ^^.

    En faite ma table se compose de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Nom
                                                               NULL ?   Type
     --------------------------------------------------------------------------
     DATA_FILE_ID
                                                               NOT NULL NUMBER
     BASE_ID
                                                               NOT NULL NUMBER
     NAME
                                                                        VARCHAR2(100)
    J'aimerais creer un trigger dessus qui me ferait un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER data_file_before_insert
    BEFORE INSERT
        ON data_files
        FOR EACH ROW
     
    BEGIN
    IF new:colonne = old:colonne1 AND new:colonne2 = old:colonne2
    --EMPECHER L'INSERT CAR C'EST UN DOUBLON		
    END;
    C'est la bonne methode d'apres vous ?
    Ou existe t-il une methode plus simple ?

    Cordialement, un debutant

  2. #2
    Invité
    Invité(e)
    Par défaut
    C'est la bonne methode d'apres vous ?
    NON !

    Ou existe t-il une methode plus simple ?
    Oui, contrainte d'unicité ou plutôt un clef primaire sur cette table. (voir les différents tutoriels de base sur developpez.com )

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 146
    Par défaut
    Je suis pas sur que je puisse appliquer ca ici, car la clef primaire (DATA_FILE_ID) de la table est une id qui s'incremente avec une sequence.

    Base_id est une FK qui pointe sur un autre table et en gros il faut que j'empeche l'ajout du referencement de mon datafile si il existe deja pour cette base sachant qu'il peut y avoir des datafile portant le meme nom mais dans des bases differentes.

    Donc si je modifie la table et que je mets la clef primaire ou une contrainte unique sur name ca risque de me faire peter des erreurs car je dois avoir quelque chose comme 300 Datafile pour chaqune de mes 200 bases et ca peut arriver qu'un programmeur utilise le meme nom pour un datafile d'un autre base.

    Et j'avoue que je suis perdu, histoire de pimenter tout ca, j'ai un echeancier extrement serre.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Contrainte d'unicité alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ALTER TABLE TOTO
    ADD CONSTRAINT TOTO_UK1 UNIQUE 
    	(
    	  COLUMN1 
    	, COLUMN2 
    	)
    ENABLE;

    Citation Envoyé par AlternantOracle Voir le message
    Donc si je modifie la table et que je mets la clef primaire ou une contrainte unique sur name ca risque de me faire peter des erreurs car je dois avoir quelque chose comme 300 Datafile pour chaqune de mes 200 bases et ca peut arriver qu'un programmeur utilise le meme nom pour un datafile d'un autre base.
    Je ne comprends pourquoi le nom d'un datafile devrait être unique ?
    Garde ta clef primaire et mets la contrainte d'unicité.
    Tu imagines qu'il est difficile de se mettre à ta place en 10 lignes, c'est pourquoi je donne des pistes mais au final, c'est à toi de faire les choses et de faire appel à ton bon jugement.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 146
    Par défaut
    Merci pour ta reponse, en faite il faudrait la meme chose mais mettre la contrainte de telle facon que si on trouve une ligne avec colonne 1 et colonne 2 identique a ce qu'on veut inserer .

    Du coup je repars du cote sur la piste de mon trigger et j'ai fait ca mais ca bug

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR REPLACE TRIGGER data_file_before_insert
    BEFORE INSERT ON data_files
        FOR EACH ROW
    DECLARE
    	v_data_file data_files.name%type;
    	v_base_id   data_files.base_id%type;
    BEGIN
    		SELECT name,base_id INTO v_data_file,v_base_id FROM data_files
    						WHERE name=:NEW.name AND base_id=:NEW.base_id;
    		IF (v_data_file > 0 ) AND (v_base_id > 0) THEN
    		RAISE_APPLICATION_ERROR(-20100, 'DATA_FILE already exists');
    		END IF;
    END;
    /
    Ici la procedure se cree correctement (pas d'erreurs).

    Je precise que ma sequence ne bug pas quand je n'utilise pas le trigger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL> INSERT INTO DATA_FILES (data_file_id,base_id,name) values
      2  (SEQ_DATA_FILE.nextval,(SELECT BASE_ID FROM BASES WHERE NOM='ORCL'),'EXMPE');
    (SEQ_DATA_FILE.nextval,(SELECT BASE_ID FROM BASES WHERE NOM='ORCL'),'EXMPE')
     *
    ERREUR Ó la ligne 2 :
    ORA-01403: aucune donnÚe trouvÚe
    ORA-06512: Ó "DATA_FILE_BEFORE_INSERT", ligne 5
    ORA-04088: erreur lors d'exÚcution du dÚclencheur
    'DATA_FILE_BEFORE_INSERT'
    Voici le modele de la table si ca peut aider
    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
     
      CREATE TABLE "DATA_FILES" 
       (	"DATA_FILE_ID" NUMBER NOT NULL ENABLE, 
    	"BASE_ID" NUMBER NOT NULL ENABLE, 
    	"NAME" VARCHAR2(100 BYTE), 
    	 CONSTRAINT "PK_DATA_FILE" PRIMARY KEY ("DATA_FILE_ID")
      USING INDEX REVERSE PCTFREE 10 INITRANS 2 MAXTRANS 255 
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
      TABLESPACE "CP_DATA"  ENABLE
       ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
      TABLESPACE "CP_DATA" ;
     
     
      CREATE OR REPLACE TRIGGER "DATA_FILE_BEFORE_INSERT" 
    BEFORE INSERT ON data_files
        FOR EACH ROW
    DECLARE
    	v_data_file data_files.name%type;
    	v_base_id   data_files.base_id%type;
    BEGIN
    		SELECT name,base_id INTO v_data_file,v_base_id FROM data_files
    						WHERE name=:NEW.name AND base_id=:NEW.base_id;
    		IF (v_data_file > 0 ) AND (v_base_id > 0) THEN
    		RAISE_APPLICATION_ERROR(-20100, 'DATA_FILE already exists');
    		END IF;
    END;
    /
    ALTER TRIGGER "DATA_FILE_BEFORE_INSERT" ENABLE;

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par AlternantOracle Voir le message
    Merci pour ta reponse, en faite il faudrait la meme chose mais mettre la contrainte de telle facon que si on trouve une ligne avec colonne 1 et colonne 2 identique a ce qu'on veut inserer .
    Citation Envoyé par Jerome_Mtl Voir le message
    Contrainte d'unicité alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ALTER TABLE TOTO
    ADD CONSTRAINT TOTO_UK1 UNIQUE 
    	(
    	  COLUMN1 
    	, COLUMN2 
    	)
    ENABLE;
    C'est pas assez clair ça ???

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [transact SQL] probleme d'update d'une table
    Par alexpalmer dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/12/2008, 14h30
  2. Update sur une Table Oracle
    Par faressam dans le forum VBScript
    Réponses: 3
    Dernier message: 18/09/2008, 10h01
  3. Probleme d'update d'une table dans un DataGridView vers une bd
    Par Faladin dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/05/2008, 20h12
  4. UPDATE sur une table (mot réservé)
    Par calp25 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 20/04/2008, 22h33
  5. probleme de delete sur une table avec somation
    Par galaad666 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/10/2006, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo