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 :

Problème avec mon Premier trigger


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Points : 22
    Points
    22
    Par défaut Problème avec mon Premier trigger
    Bonjour, je débute sur SQL Server (ça fait 1 jour...). Pour l'instant il s'agit de le prendre en main. Je dois faire un trigger qui déclencherait une alerte si on ajoute une ligne avec un champ vide (champ Nom).
    La BD est extrêmement simple puisque qu'elle n'a qu'une seule table (Liste) avec 4 champs : ID, Nom, Prénom, Téléphone.
    voici ce que j'ai tenté de faire :

    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 TRIGGER NON_NULL 
    ON Liste
    FOR INSERT
    AS 
    IF INSERTED.Nom IS NULL
    BEGIN
     
        SET NOCOUNT ON;
        RAISERROR ('Veuillez saisir un nom',11,1)
        ROLLBACK TRANSACTION
     
     
    END
    GO
    le message d'erreur est:

    Msg*8197, Niveau*16, État*4, Procédure*NON_NULL, Ligne*6
    L'objet 'Liste' n'existe pas ou n'est pas valide pour cette opération.
    D'où vient l'erreur?
    Autre question : à partir du moment où le trigger est crée, il se mettra en route automatiquement si en créant une nouvelle ligne on oublie de spécifier un nom?

    Soyez indulgents je sais bien que ça parait extrêmement simple mais je dois passer par ces étapes.

    Merci,

    Ed.

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Plusieurs choses :-)

    Un trigger doit être considéré de manière ensembliste.
    Votre trigger se déclenche une seule fois pour un ensemble de lignes inserés.
    Que se passerait il dans votre cas si vous avez plus d'une ligne inserée ?
    Je vous laisse vérifier avec votre trigger ..

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO Liste 
    SELECT 1,NULL, 'David', 0123456789
    UNION 
    SELECT 2,'mike', 'mikedavem', 0123456789
    Msg*8197, Niveau*16, État*4, Procédure*NON_NULL, Ligne*6
    L'objet 'Liste' n'existe pas ou n'est pas valide pour cette opération.
    Etes vous dans le contexte de la base de données qui héberge votre table nommé "Liste" ?

    Enfin il existe d'autres mécanismes pour stipuler qu'une valeur est obligatoire dans une colonne. Vous pouvez le définir dans le schéma de votre table au niveau de la colonne elle même avec l'instruction NOT NULL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE Liste
    (
     ID INT PRIMARY KEY,
     Nom VARCHAR(50) NOT NULL, 
     Prénom VARCHAR(50) NOT NULL, 
     Téléphone INT NOT NULL
    )
    ++

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    merci pour le message.

    voici ce que j'ai fait :

    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
    ALTER TRIGGER [dbo].[NON_NULL] 
    ON [dbo].[Liste]
    FOR INSERT
    AS 
    IF exists (select Nom from inserted where Nom='' or Nom is null)
     
    BEGIN
     
        SET NOCOUNT ON;
     
        RAISERROR ('Veuillez saisir un nom',11,1)
     
        ROLLBACK TRANSACTION
     
     
    END
    et vous aviez raison, je n'étais pas dans le contexte de ma base...

    le but de ce trigger était juste un exercice. j'avais juste désactivé la condition not null pour justement réaliser cette opération.
    par ailleurs, j'ai confondu la notion chaîne vide et NULL...

    Ed

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Points : 22
    Points
    22
    Par défaut
    Re,

    sauf que si je lance votre requête d'insertion avec 2 personnes, dont un seul a un nom qui manque, même personne qui a bien été renseignée n'est pas validée...

    merci,

  5. #5
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    C'est normal puisque pour toute erreur lors de l'exécution d'une transaction, celle-ci est totalement annulée.
    Dans le trigger, vous pouvez donc ne coder que l'ajout des lignes pour lesquelles le Nom est valué.

    Mais comme vous le suggérait Mikedavem, il est bien plus simple de mettre cette colonne comme NOT NULL.

    @++

Discussions similaires

  1. Problème avec mon trigger
    Par yabo84 dans le forum PL/SQL
    Réponses: 9
    Dernier message: 15/11/2011, 15h13
  2. [PERL]problème avec mon premier programme
    Par lucifer01 dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 07/04/2009, 18h38
  3. Problème avec mon premier exécutable en java
    Par Icefire dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 25/04/2008, 09h42
  4. [EJB2] Problème de connection avec mon premier EJB..
    Par gelinp dans le forum Java EE
    Réponses: 7
    Dernier message: 02/05/2007, 17h06
  5. Problème avec mon firewall ...
    Par Wis dans le forum Tomcat et TomEE
    Réponses: 15
    Dernier message: 06/04/2004, 08h46

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