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

Développement SQL Server Discussion :

Créer un trigger INSERT/UPDATE


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut Créer un trigger INSERT/UPDATE
    Bonjour,

    Je cherche à créer un trigger sur SAGE qui va empêcher un utilisateur quelconque de mettre la valeur d'un champs d'une table supérieure à une variable initialisée au moment d'un INSERT ou d'un UPDATE.

    Il y a une table F_PROTECTIONCPTA qui contient les utilisateurs et une autre table qui comprend un champs remise.

    Donc, faire en sorte que si le nom de l'utilisateur est 'Administrateur' alors la remise ne peut pas être supérieure à la variable initialisée.

    J'ai commencé par faire ceci:

    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
    USE BIJOU
    IF EXISTS (SELECT NAME FROM SYSOBJECTS
          WHERE NAME = 'BLOCK_USER_DISCOUNT' AND TYPE = 'TR')
       DROP TRIGGER BLOCK_USER_DISCOUNT
    GO
    CREATE TRIGGER BLOCK_USER_DISCOUNT
    ON F_DOCLIGNE
    INSTEAD OF INSERT, UPDATE
    AS
    	DECLARE @USER_ID INT,
    	             @USER_NAME VARCHAR(35),
    	             @CBCREATEUR CHAR(4),
    	             @DISCOUNT DECIMAL(24,6),
    	             @DO_TYPE SMALLINT
     
    SELECT @USER_NAME = I.PROT_User
    FROM F_PROTECTIONCPTA P INNER JOIN INSERTED I ON P.PROT_User = I.PROT_User
     
    SELECT @DISCOUNT = DL_Remise01REM_Valeur, @DO_TYPE = DO_Type, @CBCREATEUR = cbCreateur FROM INSERTED 
    WHERE @DO_TYPE BETWEEN 0 AND 8
    AND @CBCREATEUR = 'ERP1'
     
    IF(@USER_NAME = 'Administrateur')
    BEGIN
    	WHILE (@DISCOUNT > 50)
    	RAISERROR ('LA REMISE EST ELEVEE !',16,1)
    	ROLLBACK TRANSACTION
    	SET @DISCOUNT = @DISCOUNT - 1
    	CONTINUE;
    	IF(@DISCOUNT <= 50)
    	COMMIT
    	BREAK;
    END
    mais je ne suis pas sûr.

    Merci,

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    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 : 22 009
    Billets dans le blog
    6
    Par défaut
    Un déclencheur SQL Server est ensembliste (pas de ligne à ligne : il ne se déclencheur qu'une seule fois, même si l'INSERT ou l'UPDATE porte sur 1000000000000 de lignes...). De ce fait vous ne devez pas avoir en principe de variables et vous ne devez faire que des requêtes ensemblistes...
    En sus évitez les boucles stupide de rétro pédalage !

    Voici un code plus apte :

    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
    CREATE TRIGGER BLOCK_USER_DISCOUNT
    ON F_DOCLIGNE
    INSTEAD OF INSERT, UPDATE
    AS
    SET NOCOUNT ON;
    UPDATE F 
    SET    DL_Remise01REM_Valeur = 50
    FROM   F_DOCLIGNE AS  F
           INNER JOIN inserted AS I
                 ON F.??? = I.???
           INNER JOIN F_PROTECTIONCPTA AS P 
                 ON P.PROT_User = I.PROT_User
    WHERE  I.PROT_User = 'Administrateur'
      AND  DL_Remise01REM_Valeur > 50
      AND  DO_Type BETWEEN 0 AND 8
      AND  cbCreateur = 'ERP1';
    À la place de ??? mettez la colonne clef de la table F_DOCLIGNE

    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/ * * * * *

  3. #3
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    Merci pour votre réponse.

    En fait je voudrais par exemple pouvoir empêcher un utilisateur quelconque de mettre un taux de remise supérieur au taux qui lui est attribué. Une colonne est consacrée pour stocker la remise maximum à attribuer à chaque utilisateur.

    Donc, j'aimerais pouvoir afficher un message personnalisé comme ceci: "On ne peut pas attribuer à M. X une remise supérieure à n%".

    Merci encore,

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Donc, j'aimerais pouvoir afficher un message personnalisé comme ceci: "On ne peut pas attribuer à M. X une remise supérieure à n%".
    Ce qu'il faut bien comprendre, c'est qu'un moteur de bases de données relationnelles SQL n'est pas conçu pour afficher des messages, ou plus généralement présenter des données : il est au contraire perfectionné pour stocker, retrouver et traiter des données.

    Donc dans votre déclencheur, vous pouvez exécuter un SELECT qui retourne la liste des lignes que l'on ne peut pas mettre à jour du fait de l'implémentation de la règle métier.
    Spécifiez ensuite l'UPDATE qui exclut ces lignes : il ne traite alors que les lignes dont le taux de remise est valide.

    Enfin à vous de tester dans votre application si l'ensemble retourné par le déclencheur est vide ou pas; s'il ne l'est pas, afficher la liste des erreurs

    @++

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    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 : 22 009
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Jinkas Voir le message
    ... Une colonne est consacrée pour stocker la remise maximum à attribuer à chaque utilisateur....
    Ou ??? Dans quelle table ???? SOYEZ PRÉCIS !

    Lisez la charte de postage de ce forums : http://www.developpez.net/forums/d96...-avant-poster/

    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/ * * * * *

  6. #6
    Membre très actif
    Avatar de landry161
    Homme Profil pro
    C#,PHP,MySQL,Android...
    Inscrit en
    Juillet 2010
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : C#,PHP,MySQL,Android...

    Informations forums :
    Inscription : Juillet 2010
    Messages : 423
    Billets dans le blog
    1
    Par défaut Précision
    Vouloir gerer ce problème à partir d'un triggers, n'est ce pas un peu trop compliqué

  7. #7
    Membre très actif
    Avatar de landry161
    Homme Profil pro
    C#,PHP,MySQL,Android...
    Inscrit en
    Juillet 2010
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : C#,PHP,MySQL,Android...

    Informations forums :
    Inscription : Juillet 2010
    Messages : 423
    Billets dans le blog
    1
    Par défaut Précision
    Vouloir gérer ce problème à partir d'un triggers, n'est ce pas un peu trop compliqué

  8. #8
    Membre très actif
    Avatar de landry161
    Homme Profil pro
    C#,PHP,MySQL,Android...
    Inscrit en
    Juillet 2010
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : C#,PHP,MySQL,Android...

    Informations forums :
    Inscription : Juillet 2010
    Messages : 423
    Billets dans le blog
    1
    Par défaut
    Et puis tu peux au moins au mettre la description des differentes tables qui interviennent dans la création de ton triggers, ça m' aiderait.Merci.

Discussions similaires

  1. [2008] SQL SERVER - Trigger INSERT/UPDATE pour autre Database
    Par warri0r21 dans le forum Développement
    Réponses: 10
    Dernier message: 20/01/2014, 15h06
  2. [2005] TRIGGER insert,update et delete
    Par lbh85 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 15/04/2013, 12h56
  3. créer une fonction insert/update
    Par pitchounette13 dans le forum Débuter
    Réponses: 10
    Dernier message: 03/07/2008, 15h25
  4. TRIGGER INSERT UPDATE - Savoir si Insert ou Update
    Par mail.spam dans le forum Développement
    Réponses: 2
    Dernier message: 25/06/2008, 11h39
  5. [trigger] insert update et delete
    Par kooljy dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 13/07/2006, 09h56

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