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

Oracle Discussion :

Bloquer la mise à jour pour certains enregistrements à partir d'une vue [10gR2]


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Bloquer la mise à jour pour certains enregistrements à partir d'une vue
    Bonjour et bonnes années,

    Je voulais savoir s'il était possible directement au niveau d'Oracle (10.2.0.4) de bloquer la mise à jour de données pour certains enregistrements consultés à partir de la vue.
    En effet, dans mon application je dois pouvoir afficher l'ensemble des enregistrements via une vue mais seuls certains doivent être modifiables et je ne peux pas le gérer au niveau de l'application.

    Merci d'avance pour vos réponses.

    Cordialement.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Avec un trigger instead of sur votre vue ça doit se faire, mais je ne sais pas si c'est la meilleure méthode :
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    create table t_BiancaG (id number(2) primary key, val  varchar2(30));
    -- Table created.
     
    insert into t_BiancaG (id, val) values (1, 'Val 1');
    -- 1 row(s) inserted.
    insert into t_BiancaG (id, val) values (2, 'Val 2');
    -- 1 row(s) inserted.
     
    create view v_BiancaG (id, val) as
    select id, val
      from t_BiancaG;
    -- View created.
     
    create trigger tiou_v_BiancaG 
    INSTEAD OF update on v_BiancaG 
    FOR EACH ROW
    begin
      update t_BiancaG
         set val = :new.val
       where id  = :old.id;
    end;
    /
    -- Trigger created.
     
    select id, val from v_BiancaG;
     
    ID VAL
    -- -----
     1 Val 1
     2 Val 2
     
    update v_BiancaG
       set val = 'Valeur 1'
     where id  = 1;
    -- 1 row(s) updated.
     
    select id, val from v_BiancaG;
     
    ID VAL
    -- --------
     1 Valeur 1
     2 Val 2
     
    update v_BiancaG
       set val = 'Valeur 3'
         , id  = 3
     where id  = 2;
    -- 1 row(s) updated.
     
    select id, val from v_BiancaG;
     
    ID VAL
    -- --------
     1 Valeur 1
     2 Valeur 3

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Bonjour et merci pour cette piste.

    J'ai tenté de la mettre en œuvre et suis confrontée à un problème en amont : le trigger bloque toute mise à jour des enregistrements.

    Je m'explique.

    1- création du trigger avec uniquement l'affichage d'un message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER SIR.TRG_V_SIR_PROG_TEST
        INSTEAD OF UPDATE ON SIR.V_SIR_PROG_TEST REFERENCING 
        NEW AS NEW 
        OLD AS OLD 
        FOR EACH ROW 
    BEGIN
    DBMS_OUTPUT.ENABLE( 1000000 ) ;
    DBMS_OUTPUT.PUT_LINE( 'toto' ) ;
    END;
    2- mise à jour d'un enregistrement à partir de ma vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set serveroutput on;
    update v_sir_prog_test set estimation=65000 where axe='D526';
    Je passe bien dans le trigger et mon enregistrement semble être mis à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto
     
    1 ligne mise à jour.
    Ensuite je fais un commit pour valider la mise à jour et résultat : la mise à jour n'a pas été effectuée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select estimation from v_sir_prog_test where axe='D526';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ESTIMATION
    ----------
         62000
     
    1 ligne sélectionnée.
    Dès que je désactive le trigger la mise à jour passe sans soucis.

    Avez-vous une explication ?

    Merci d'avance.

    Bianca

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par BiancaG Voir le message
    Avez-vous une explication ?
    Le déclencheur INSTEAD OF - comme son nom l'indique - remplace la commande envoyée.
    Dans votre déclencheur, vous ne faites qu'afficher des messages, ce que fait le SGBD.
    Il faut bien coder votre mise à jour.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Bonjour et merci pour ces éléments.

    Je n'avais pas compris le fonctionnement du trigger sur vue.

    Du coup mon problème est résolu en 2 temps :
    1- côté applicatif, lorsque l'utilisateur modifie un enregistrement normalement non modifiable (ancien statut <> 'N') il y a un message d'avertissement lui indiquant que ces modifications seront perdues
    2- côté base de données avec le trigger instead of, j'ai ajouté un filtre afin que la requête de mise à jour soit effective uniquement sur les enregistrements modifiables (ancien statut='N'). Cf ci-dessous

    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 SIR.TRG_V_SIR_PROG_PRIO_U_STA_NO_N 
        INSTEAD OF UPDATE ON SIR.V_SIR_PROG_PRIORISATION REFERENCING 
        NEW AS NEW 
        OLD AS OLD 
        FOR EACH ROW 
    BEGIN
    	IF :OLD.STATUT='N' THEN
    		UPDATE SIR_PROG_GL_OP_GENERAL SET STATUT=:NEW.STATUT,PRIORITE_MAND=:NEW.PRIORITE_MAND,ANNEE_PROG=:NEW.ANNEE_PROG,OBJET=:NEW.OBJET,NATURE=:NEW.NATURE,ESTIMATION=:NEW.ESTIMATION,CONVENTION=:NEW.CONVENTION,OBSERVATION_MAND=:NEW.OBSERVATION_MAND,OBSERVATION_TEMP=:NEW.OBSERVATION_TEMP,COP=:NEW.COP,MOE_ETUDE=:NEW.MOE_ETUDE,MOE_TRAVAUX=:NEW.MOE_TRAVAUX,MODE_DEVOLUTION_PRINCIPALE=:NEW.MODE_DEVOLUTION_PRINCIPALE,ETAT_AVANCEMENT=:NEW.ETAT_AVANCEMENT,DATE_DEBUT_TRAVAUX=:NEW.DATE_DEBUT_TRAVAUX,PROCEDURE_LOI_EAU=:NEW.PROCEDURE_LOI_EAU,PROCEDURE_FONCIER=:NEW.PROCEDURE_FONCIER,PROCEDURE_AUTRE=:NEW.PROCEDURE_AUTRE,PROCEDURE_DESC=:NEW.PROCEDURE_DESC,RISQUE=:NEW.RISQUE,UTILISATEUR_MODIF=:NEW.UTILISATEUR_MODIF,DATE_MODIF=:NEW.DATE_MODIF WHERE ID_SIR_PROG_GL_OP_GENERAL=:NEW.ID_SIR_PROG_GL_OP_GENERAL;			
    	END IF;
    END;
    /
    Merci beaucoup.

    Cordialement

    Bianca

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/05/2014, 12h46
  2. [WD14] mise à jour d'un enregistrement à partir d'une autre table
    Par piogo113 dans le forum WinDev
    Réponses: 9
    Dernier message: 05/05/2010, 19h06
  3. Réponses: 2
    Dernier message: 26/01/2007, 15h56
  4. Réponses: 6
    Dernier message: 29/06/2006, 14h00
  5. [VB.NET] Mise à jour d'un site à partir d'une application
    Par boulete dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/04/2006, 12h15

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