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

MS SQL Server Discussion :

Trigger sous SQL-Server


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Points : 157
    Points
    157
    Par défaut Trigger sous SQL-Server
    voila ce schéma

    et voila la question:
    Écrire un (des) déclencheur(s) qui empêche(nt) d'avoir dans la BD des personnes ayant écrit plus de 2 œuvres et étant traducteur d'un livre
    la réponse sur la table ecrit_par :
    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
      create trigger pas2oeuvresTraducteur on ecrit_par
      after insert
      as
     
         declare @estTraducteur int
         declare @idPersonne int
     
      begin
     
         set nocount on;
         select @estTraducteur=0    
         select @idPersonne=ecrivain from inserted
     
         select @estTraducteur=count(trad),count(ecrivain) from ecrit_par
         join traducteur_ecrivain on @idPersonne=ecrivain
         join traduit_par on tradecr=trad
         where @idPersonne=trad
         group by trad
         having count(ecrivain) > 2    
     
         if(@estTraducteur > 0)
          ROLLBACK TRANSACTION
      end
    j'aimerais bien que vous m'expliquiez brièvement ce que fais ce bout de code
    +
    ce que je comprends pas:
    on a mis after insert faut pas accepter l'enregistrement , on devrait pas déclencher le trigger avant?
    cette ligne : et là aussi y'a-t-il une erreur ?? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(trad),count(ecrivain)
    et c'est invalider la saisie ,mais transaction je comprends pas

  2. #2
    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 : 43
    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,

    Votre trigger est faux de par le simple fait qu'il n'est pas ensembliste.

    on a mis after insert faut pas accepter l'enregistrement , on devrait pas déclencher le trigger avant?
    Cela n'existe pas sous SQL Server : vous avez soit AFTER, soit INSTEAD OF, mais pas BEFORE.

    SET NOCOUNT ON est une option de session (c'est-à-dire le contexte d'exécution de votre requête) qui indique à SQL Server de ne pas retourner au client (votre application, SQL Server Management Studio, ...) le nombre de lignes affectées par le trigger.
    Donc aucun problème, c'est même une bonne pratique.

    et c'est invalider la saisie ,mais transaction je comprends pas
    Ne confondez pas ce qui se passe côté client (la saisie) et ce qui se passe en base de données (la transaction) : ce sont deux choses bien distinctes et elles doivent le rester.
    Une base de donnée relationnelle SQL est conçue pour stocker, modifier et restituer des données, mais pas pour les présenter.

    Lorsque l'application va réaliser un INSERT dans cette table, cet INSERT va déclencher le trigger, et le code qu'il exécute fait partie, transactionnellement, de l'INSERT : si l'INSERT plante, le trigger n'est pas exécuté.
    Et si le trigger plante, ou que l'on fait un ROLLBACK, l'INSERT est annulé.
    Je vous conseille de lire l'article de SQLPro sur le sujet (1).

    Voyons donc comment faire avec un trigger INSTEAD OF INSERT : dans ce cas, si la contrainte est vérifiée, on réalise l'INSERT;
    sinon, on ne fait rien, et on lève une erreur :

    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
    CREATE TRIGGER TR_IOF_I_ecrit_par
    	ON dbo.ecrit_par
    INSTEAD OF INSERT
    AS
    BEGIN
    	SET NOCOUNT ON	
     
    	IF EXISTS
    	(
    		SELECT		*
    		FROM		dbo.ecrit_par AS EP
    		INNER JOIN	inserted AS I
    					ON EP.ecrivain = I.ecrivain
    		INNER JOIN	dbo.traducteur_ecrivain AS TE
    					ON EP.ecrivain = TE.ecrivain
    		INNER JOIN	dbo.traduit_par AS TP
    					ON TP.ecrivain = TE.ecrivain
    		GROUP BY	TE.ecrivain
    		HAVING		COUNT(DISTINCT EP.oeuvre) > 2
    				AND COUNT(DISTINCT TP.livre) > 0
    	)
    	BEGIN	
    		RAISERROR('Au moins un écrivain a déjà écrit plus de deux livre et traduit plus d''une oeuvre', 16, 1)
     
    		RETURN	
    	END
    	ELSE
    	BEGIN
    		INSERT	INTO dbo.ecrit_par
    		(
    			oeuvre
    			, ecrivain
    		)
    		SELECT	oeuvre
    			, ecrivain
    		FROM	inserted
    	END
    END
    @++

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Points : 157
    Points
    157
    Par défaut
    un très grand merci pour toi c'est trop gentil surtout qu'on trouves des problème a comprendre nos profs ; ils sont trop nuls

  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 : 43
    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
    Malheureusement les professeurs ont très peu de temps pour nous donner les requis nécessaires à la compréhension de ce qu'est exactement une base de données relationnelle SQL, et bien peu d'entre eux ont l'occasion (ou la passion ?) de coder intensivement en SQL...
    Quand on entre dans le monde du travail, la chute est longue ...

    Demandez à SQLPro, il en sait quelque chose en tant qu'enseignant au CNAM

    @++

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

Discussions similaires

  1. Création de trigger sous SQL Server 2008
    Par lessoy dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/04/2013, 12h49
  2. Tester la performance d'un trigger sous SQL Server 2008
    Par lerieure dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/02/2011, 18h04
  3. Equivalent de rownum sous SQL server
    Par Isildur dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/07/2009, 15h48
  4. Réponses: 20
    Dernier message: 15/05/2009, 14h05
  5. MAJ d'une table sous SQL Server par insertion
    Par keish dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/06/2003, 16h23

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