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] Bloquer la mise à jour


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Zalawy
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 137
    Par défaut [TRIGGER] Bloquer la mise à jour
    Bonjour,

    Je ne sais pas si je suis au bon endroit et j'ai besoin de votre aide pour une partie de code.
    Je veux bloquer la mise à jour d'une personne dehors d'heures de travail (de 17h à 9h), est-ce que ce n'est pas une table qu'il faut bloquer la mise à jour?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER MAJAUTO
    BEFORE UPDATE OF majannule ON MY_TABLE
    FOR EACH ROW 
      BEGIN
         IF UDPATE PERSONNE
    	SET new.NUM_PERSONNE = 1
    	WHERE --> heure de blocage de la mise à jour d'une personne ?
         END IF
      END;
    Merci

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Pour bien comprendre le besoin :
    1) Entre 17h et 9h, la personne a toujours le droit le droit de lire les données (SELECT), mais pas de les modifier ? Ou bien elle n'a pas le droit de se connecter du tout ?
    2) Est-ce que ça concerne toutes les tables, ou juste une table particulière ?
    3) Quelle est votre version d'Oracle ?

  3. #3
    Membre confirmé Avatar de Zalawy
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 137
    Par défaut Corriger le code de trigger
    Je vous remercie de votre retour, je vois que je manque beaucoup de description. Pour commencer, je souhaite de bloquer les modifications juste de la table PERSONNE en dehors des heures de travail et aussi le week-end.
    J'ai fait la sélection pour afficher les heures et jours comme vous l'avez dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT to_char(sysdate,'HH:MM') , to_char(sysdate+5,'DAY'), to_char(sysdate+6,'DAY')
      FROM SALARIE;
    Mais je veux faire un trigger qui permet de bloquer les modifications de la table en dehors des heures de travail, voici le code que j'ai modifié :
    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
    CREATE OR REPLACE TRIGGER MAJAUTO
    BEFORE UPDATE OF PERSONNE ON MY_TABLE
    FOR EACH ROW
    
    BEGIN
      SELECT to_char(sysdate,'HH:MM') , to_char(sysdate+5,'DAY'), to_char(sysdate+6,'DAY')
      FROM SALARIE;
     
      UPDATE PERSONNE
      SET NUM_PERSONNE = new.NUM_PERSONNE, 
    	NOM = new.NOM,
      	PRENOM = new.PRENOM;
    
    EXCEPTION
          Raise exception? 
    
    END;
    Pour la mise à jour, il s'agit les champs (nom, prenom, id) de la table PERSONNE que la mise à jour effectue et est-ce que c'est bien le code suivant? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      UPDATE PERSONNE
      SET NUM_PERSONNE = new.NUM_PERSONNE, 
    	NOM = new.NOM,
      	PRENOM = new.PRENOM;
    Car après ma recherche, le tutoriel guide la mise à jour sur un champ alors que je veux la mise à jour qui effectuera sur tous les champs.

    Pour le trigger, j'hésite d'ajouter la condition en mettant IF avant SELECT et après EXCEPTION,non?

    Pour plus de détail, la version d'Oracle : 18.1.0

    Pour l'information, j'ai cherché pas mal de net sur l'empêchement de modifier et j'ai trouvé "RAISE EXCEPTION" pas expliquer la précision comme le tuto.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 29
    Par défaut
    Bonjour Zalawy,
    si j'ai bien compris, tu cherches à empêcher la mise à jour d'une table (PERSONNE), si cette modification ne respecte pas des conditions temporelles (heures, jours ouvrables…).
    Le mieux pour moi est que tu testes les différentes conditions que tu désires faire respecter dans ton déclencheur, puis si l'une d'elle ne l'est pas tu génères une exception personnelle, ce qui va bloquer complètement le processus de mise à jour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    monException EXCEPTION ;
    BEGIN
    IF….condition_pas_respectée THEN
    	RAISE monException ;
    END IF ;
    END ;
    Il est à noter que tu peux enrichir tes propres exceptions en leur définissant un code erreur qui s'affichera en tant que cause du problème, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    raise_application_error( monNombre, 'Mon erreur car saisie en dehors des heures');
    PRAGMA EXCEPTION_INIT(monException, monNombre);
    RAISE monException;
    (monNombre doit être négatif et compris dans la plage -20999 … -20000 ; voir https://docs.oracle.com/cd/B10501_01...24/07_errs.htm)

    Bonne fin de journée.

  5. #5
    Membre confirmé Avatar de Zalawy
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 137
    Par défaut
    @Beretb : Je vous remercie de votre réponse. Oui,la modification ne respecte pas en dehors des heures de travail et le programme empêche la mise à jour d'une table PERSONNE. J'ai testé les requêtes mais pas les conditions car je ne connais pas trop le code qui permet d'empêcher la mise à jour et c'est pour cela que je demande l'aide.

    Voici le code que j'ai modifié et pour le code d'erreur, je ne sais pas lequel mais l'erreur programme correspond au blocage de la modification :
    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
    CREATE OR REPLACE TRIGGER MAJAUTO
    BEFORE UPDATE OF PERSONNE ON MY_TABLE
    FOR EACH ROW
    
    DECLARE
            monException EXCEPTION; 
    
    BEGIN
        IF (SELECT to_char(sysdate,'HH:MM') , to_char(sysdate+5,'DAY'), 	to_char(sysdate+6,'DAY')
      	FROM SALARIE;) NOT NULL THEN 
        	UPDATE PERSONNE
      	SET NUM_PERSONNE = new.NUM_PERSONNE, 
    	NOM = new.NOM,
      	PRENOM = new.PRENOM;
    
    	EXCEPTION 
    	raise_application_error(-06501, 'Mon erreur car saisie en dehors des heures');
    	PRAGMA EXCEPTION_INIT(monException, -06501);
    	RAISE monException;
      END IF;
    END;
    Citation Envoyé par beretb Voir le message
    Le mieux pour moi est que tu testes les différentes conditions que tu désires faire respecter dans ton déclencheur, puis si l'une d'elle ne l'est pas tu génères une exception personnelle, ce qui va bloquer complètement le processus de mise à jour.
    Est-ce que ça veut dire que le déclenchement avant la mise à jour? Ou Après la mise à jour? Car j'ai indiqué avant d'où le code (il convient bien après la mise à jour)

    Une question, pourquoi la déclaration monException EXCEPTION;? Je ne suis pas certaine d'avoir bien compris pour l'exception...

    Merci d'avance

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    Avez-vous pensé aux jours fériés ?

    Le plus simple serait de créer une table des jours ouvrés de la forme ;
    DATE, heure_debut, heure_fin
    et de faire une jointure avec cette table.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/01/2014, 10h35
  2. Réponses: 0
    Dernier message: 27/02/2013, 15h51
  3. [E-03] Bloquer la mise à jour de l'heure
    Par Cthulhu_RLyeh dans le forum Excel
    Réponses: 1
    Dernier message: 17/02/2009, 10h08
  4. Trigger impliquant une mise à jour
    Par rad_hass dans le forum Développement
    Réponses: 6
    Dernier message: 16/05/2007, 16h40
  5. [trigger] problème de mise à jour
    Par Ouark dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/03/2006, 01h13

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