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

Administration SQL Server Discussion :

Problème de trigger


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut Problème de trigger
    Bonjour,

    Je n'arrive pas à définir un trigger de manière ensembliste. Voici ce que je voudrais arriver à faire...

    Soit la table suivante :
    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
    CREATE TABLE [dbo].[T_CONTRACT_CTR](
        [CTR_ID] [int] IDENTITY(1,1) NOT NULL,
        [CTR_DATE] [date] NOT NULL,
        [BRA_ID] [int] NOT NULL,
        [DEP_ID] [smallint] NOT NULL,
        [SUP_ID] [int] NOT NULL,
     CONSTRAINT [PK_T_CONTRACT_CTR] PRIMARY KEY CLUSTERED 
    (
        [CTR_ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    ALTER TABLE [dbo].[T_CONTRACT_CTR]  WITH CHECK ADD  CONSTRAINT [FK_T_CONTRACT_CTR_TJ_DEP_JSB_JDJ] FOREIGN KEY([DEP_ID], [BRA_ID], [SUP_ID])
    REFERENCES [dbo].[TJ_DEP_JSB_JDJ] ([DEP_ID], [BRA_ID], [SUP_ID])
    GO
     
    ALTER TABLE [dbo].[T_CONTRACT_CTR] CHECK CONSTRAINT [FK_T_CONTRACT_CTR_TJ_DEP_JSB_JDJ]
    GO
    Lors de l'insertion de nouvelles lignes, il faut que la date insérée dans la colonne CTR_DATE soit plus grande que toutes les autres valeurs de CTR_DATE pour le triple {DEP_ID, BRA_ID, SUP_ID}.

    Mais je n'arrive pas à formuler cette condition dans un IF.

    Mais p-e que je fais fausse route à la base.

  2. #2
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Je pense y être finalement arriver avec 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
    IF EXISTS    (
                    SELECT    *
                    FROM    DBO.T_CONTRACT_CTR CTR
                                INNER JOIN inserted INS
                                    ON    CTR.BRA_ID = INS.BRA_ID
                                    AND    CTR.DEP_ID = INS.DEP_ID
                                    AND    CTR.SUP_ID = INS.SUP_ID
                                    AND    CTR.CTR_DATE > INS.CTR_DATE
                    )
            DELETE    
            FROM    DBO.T_CONTRACT_CTR
            WHERE    CTR_ID IN    (
                                SELECT    INS.CTR_ID
                                FROM    DBO.T_CONTRACT_CTR CTR
                                            INNER JOIN inserted INS
                                                ON    CTR.BRA_ID = INS.BRA_ID
                                                AND    CTR.DEP_ID = INS.DEP_ID
                                                AND    CTR.SUP_ID = INS.SUP_ID
                                                AND    CTR.CTR_DATE > INS.CTR_DATE)

  3. #3
    Expert confirmé
    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 : 46
    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
    Par défaut
    Hmm ton trigger ne fait pas ce que tu dis dans le postulat de départ

    Lors de l'insertion de nouvelles lignes, il faut que la date insérée dans la colonne CTR_DATE soit plus grande que toutes les autres valeurs de CTR_DATE pour le triple {DEP_ID, BRA_ID, SUP_ID}.
    Dans ton trigger si j'ai bien compris si tu trouves au moins une ligne dont la date est supérieure à celle insérée tu les supprimes ... est ce vraiment le comportement voulu ?

    ++

  4. #4
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Bah je me trouve dans l'after insert (car y avait déjà un trigger after insert pour insérer un truc dans une autre table alors autant l'utiliser).

    Donc si une ligne insérer contient une date avec une date plus petite que la date maximum pour le triplet{BRA_ID, SUP_ID, DEP_ID}, cela n'est pas valide donc je la supprime.

    A la base, je voulais tester cela dans une contrainte CHECK histoire de ne pas avoir à supprimer à posteriori mais je n'y suis pas arrivé .

  5. #5
    Expert confirmé
    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 : 46
    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
    Par défaut
    et pourquoi pas un trigger FOR INSERT et un ROLLBACK ?

    ++

  6. #6
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    et pourquoi pas un trigger FOR INSERT et un ROLLBACK ?

    ++
    Je crois que la réponse technique est "parce que j'suis un noob" .

    Je connaissais les triggers AFTER INSERT et INSTEAD OF INSERT mais pas FOR INSERT.

    Je testerai demain

Discussions similaires

  1. PL/SQL problème sur Trigger
    Par kitsune dans le forum PL/SQL
    Réponses: 4
    Dernier message: 06/12/2005, 20h35
  2. [9i] problème avec trigger after logon
    Par Michael# dans le forum Oracle
    Réponses: 2
    Dernier message: 17/03/2005, 12h14
  3. [Interbase6] Problème de triggers
    Par emeraudes dans le forum Bases de données
    Réponses: 4
    Dernier message: 08/03/2005, 09h52
  4. [SQLPLUS] - Problème de Triggers Java
    Par farcis dans le forum Oracle
    Réponses: 7
    Dernier message: 23/12/2004, 09h21
  5. [PL/SQL] problème de trigger
    Par Chuck67 dans le forum Oracle
    Réponses: 14
    Dernier message: 09/12/2004, 23h17

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