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 :

Debutant:SQL Server Express-Pb de Trigger


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé Avatar de libremax
    Profil pro
    Chargé de projets
    Inscrit en
    Mars 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de projets

    Informations forums :
    Inscription : Mars 2007
    Messages : 168
    Par défaut Debutant:SQL Server Express-Pb de Trigger
    Bonjour,
    Je cherche à faire un trigger instead of Update.
    J'ai 3 tables
    T_info avec (Id_info,Nom,Prenom)
    T_Profession(Id_Prof,Fonction)
    T_Utilisation(Id_Util,Id_Info,Id_Prof,Nom,Prenom,Fonction)
    Je voudrais faire un test de façon à ce que lorsque je change le nom ou prenom de ma table T_Utilisation c'est juste dans ma table T_info que cela se repercute.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ALTER TRIGGER [dbo].[Util_Update] 
       ON  [dbo].[T_Utilisation] 
    Instead of update
    AS 
    BEGIN
    update [dbo].[T_Info] SET 
    		[T_Info].[Nom] = [nom]
    		,[T_Info].[Prenom] = [Prenom]
     WHERE [T_info].[Id_info]= [Id_info]
    END
    go
    Apres si je fait un update de T_Utilisation rien ne se passe.
    Comment recupére t'on les nouvelles valeurs de la modification de la table T_Utilisation ?
    Moi je met les champs [nom],[prenom] mais cela ne dois pas etre ça.
    Un peu d'aide serais bien venue.
    salutations.

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 228
    Billets dans le blog
    25
    Par défaut
    La première partie est juste : il faut juste remettre dans la table source les données d'avant update (se trouvant dans la table deleted) afin que la mise à jour ne se fasse pas dans la table T_Utilisation
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Membre confirmé Avatar de libremax
    Profil pro
    Chargé de projets
    Inscrit en
    Mars 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de projets

    Informations forums :
    Inscription : Mars 2007
    Messages : 168
    Par défaut re
    bonjour,
    le probléme est là.
    Je ne sais pas comment intercepter les nouvelles infos.
    salutations.

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Les triggers "génèrent" les pseudo tables INSERTED ET DELETED. Ces tables contiennent les enregistrements qui sont ajoutés (INSERTED), supprimés (DELETED) et modifiés (INSERTED ET DELETED).

    Ces pseudo tables ont évidemment la même structure que la table qui a déclenché le trigger.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    il faut faire attention également que l'on peut faire des updates, ajout, delete de mass et donc les tables inserted, deleted contiendront plus qu'une valeur

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    D'où le pluriel que j'ai utilisé.

  7. #7
    Membre confirmé Avatar de libremax
    Profil pro
    Chargé de projets
    Inscrit en
    Mars 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de projets

    Informations forums :
    Inscription : Mars 2007
    Messages : 168
    Par défaut reponse
    Bonjour a tous,
    Ok je comprend mais comment on les gerent car moi je met
    UPDATE [dbo].[T_Info] SET
    [T_Info].[Nom] = [nom]
    ,[T_Info].[Prenom] = [Prenom]
    WHERE [T_info].[Id_info]= [Id_info]
    en supposant que [nom],[prenom] representent les champs de ma table
    qui ont changés.mais cela ne marche pas
    salutations.

  8. #8
    Membre confirmé Avatar de libremax
    Profil pro
    Chargé de projets
    Inscrit en
    Mars 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de projets

    Informations forums :
    Inscription : Mars 2007
    Messages : 168
    Par défaut Re
    Bonjour a tous,
    j'ai trouvé comment intercepter les nouvelles valeurs:
    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
     
    ALTER TRIGGER [dbo].[Util_Update] 
       ON  [dbo].[T_Utilisation] 
    Instead of update
    AS 
    declare @Nom nchar(10)
    declare @Prenom nchar(10)
    declare @Id_info int
    declare Curseur cursor for select nom,prenom,Id_info from inserted;
    BEGIN
    	open Curseur;
    	fetch next from Curseur into @Nom, @Prenom,@id_info;
    	while (@@FETCH_STATUS=0)
    		begin
    			update [dbo].[T_Info] 
    				SET 
    					[T_Info].[Nom] = @nom
    					,[T_Info].[Prenom] = @Prenom
    				WHERE [T_info].[Id_info]= @Id_info
    			Fetch next from curseur
    		end
    	close Curseur
    	deallocate Curseur
    END
    go
    Maintenant j'ai un autre problème.Si j' insert une ligne, le trigger doit passer en insert to et non plus en update
    Comment Faire pour que mon trigger sait si c'est un Insert ou un update qu'il doit faire.
    Salutations

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Vous n'êtes pas obligés de passer par un curseur pour faire vos mises à jour. C'est contre performant. Utilisez plutôt des jointures avec les pseudo tables INSERTED et DELETED.

    J'ai déjà expliqué comment vous pouviez reconnaitre les enregistrements supprimés, ajoutés ou modifiés. Lisez les réponses qu'on vous donne et posez des questions sur les parties qui nécessitent plus d'explications. Reposer la même question ne vous avancera pas.

    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
    INSERT INTO T_INFO ...
    SELECT ...
    FROM INSERTED 
    	LEFT JOIN DELETED 
    		ON INSERTED.Id_info = DELETED.Id_info
    WHERE DELETED.Id_info IS NULL
     
    UPDATE T_INFO SET ...
    FROM T_INFO
    	INNER JOIN INSERTED 
    		ON T_INFO.Id_Info = INSERTED.Id_info
    	INNER JOIN DELETED 
    		ON INSERTED.Id_info = DELETED.Id_info
     
    DELETE T_INFO 
    FROM T_INFO
    	INNER JOIN DELETED 
    		ON T_INFO.Id_info = DELETED.Id_info
    	LEFT JOIN INSERTED 
    		ON INSERTED.Id_info = DELETED.Id_info
    WHERE INSERTED.Id_info IS NULL
    L'exécution de ces 3 requêtes (les ... sont à compléter) dans le trigger devrait faire l'affaire.

    Une ligne insérée apparaît dans INSERTED mais pas dans DELETED
    Une ligne modifiée apparaît dans INSERTED et DELETED
    Une ligne supprimée apparaît dans DELETED mais pas dans INSERTED

  10. #10
    Membre confirmé Avatar de libremax
    Profil pro
    Chargé de projets
    Inscrit en
    Mars 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de projets

    Informations forums :
    Inscription : Mars 2007
    Messages : 168
    Par défaut re
    Bonjour vmolines,
    merci pour l'info je vait le potasser.
    salutation

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

Discussions similaires

  1. [debutant]sql server 2005 express edition x64 !?
    Par ChristopheOce dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/12/2007, 13h51
  2. Sql Server Express - Probleme index unique et valeurs null
    Par Fayoul dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 17/02/2006, 18h22
  3. sql server express 2005 en français
    Par gock dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/01/2006, 17h03
  4. license sql server express 2005
    Par roninou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/11/2005, 17h21
  5. compatibilité Sql server express 2005 & Mondrian
    Par xikilla dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/10/2005, 15h12

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