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 :

Remplacer un champ par une variable sur une select from deleted


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Remplacer un champ par une variable sur une select from deleted
    Bonjour/Bonsoir,

    Je rencontre actuellement une problème de taille.

    Comme une petit dessin vaut mieux qu'un long discours, voici un schéma de ce que j'aimerai appliquer:

    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
    OPEN leCurseur	
    FETCH leCurseur INTO @leChamp
    WHILE @@FETCH_STATUS = 0
    FETCH NEXT FROM leCurseur
    BEGIN
    
    	SELECT @last_value = @leChamp from DELETED
    	SELECT @new_value = @leChamp from INSERTED
    
    	IF @last_value <> @new_value
    	BEGIN
    		INSERT INTO TB_FDR_ITEM_HISTO VALUES ( @ID_USER, @date, @table_name, @leChamp, @id_champ, @last_value, @new_value)
    	END
    
    END
    CLOSE leCurseur
    leCurseur contient actuellement une vue comprenant tous les champs d'une table nommée TB_FDR_ITEM
    Je sais que les lignes en rouges sont fausses.

    Je précise que j'ai essayé avec un EXEC sp_execsql et tout le bazar, sauf que dans ce cas là, deleted et inserted ne sont pas reconnus.

    Quelqu'un a-il une idée?


    Cordialement

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous ne pouvez pas utiliser une variable comme nom de colonne dans une requête, à moins de passer par du SQL dynamique.

    Il n'y a pas que les lignes en rouges qui sont fausses, les autres aussi !

    Mettez nous le code complet du trigger, et surtout, dites nous ce que vous voulez faire, je pense que vous êtes partis dans la mauvaise direction.

    Si vous voulez simplement historiser les modifications dans une table, pourquoi ne pas utiliser CHANGE DATA CAPTURE, fonctionnalité intégrée à SQL Server ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour, et merci de votre réponse

    Je suis effectivement en train de réaliser un historique des modifications. La table recevant cet historique doit également recevoir historique de 4 tables supplémentaires. Je ne connais pas "CHANGE DATA CAPTURE"', je vais m'y intéressé de ce pas. En attendant, voici le code complet de mon trigger (actuellement sur une seule table ).

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    CREATE TRIGGER trg_histo_insert_update
    ON TB_FDR_ITEM
    AFTER  UPDATE
    AS
    
    DECLARE @id_user int
    DECLARE @last_value nvarchar(max)
    DECLARE @table_name nvarchar(50)
    DECLARE @date date
    DECLARE @new_value nvarchar(max)
    DECLARE @leChamp nvarchar(30)
    DECLARE @requete1 nvarchar(max)
    DECLARE @requete2 nvarchar(max)
    DECLARE @id_champ int
    
    set @table_name = 'TB_FDR_ITEM'
    /* rajouter un IF pour insert */
    set @date = GETDATE();
    
    select @id_user = IT_ID_USER_HISTO from inserted
    select @id_champ = ID_FDR_ITEM from inserted
    
    DECLARE leCurseur CURSOR LOCAL FOR 
    	SELECT COLUMN_NAME 
    	FROM INFORMATION_SCHEMA.COLUMNS 
    	WHERE TABLE_NAME = @table_name
    	AND COLUMN_NAME <> 'IT_ID_USER_HISTO'
    	
    
    /* boucle pour voir les champs modifiés */
    OPEN leCurseur	
    FETCH leCurseur INTO @leChamp
    
    WHILE @@FETCH_STATUS = 0
    FETCH NEXT FROM leCurseur
    BEGIN
    	
    	SELECT @last_value = @leChamp from DELETED
    	SELECT @new_value = @leChamp from INSERTED
    	print @last_value
    	print @new_value
    	IF @last_value <> @new_value
    	BEGIN
    		INSERT INTO TB_FDR_ITEM_HISTO VALUES ( @id_user, @date, @table_name, @leChamp, @id_champ, @last_value, @new_value)
    	END
    
    END
    CLOSE leCurseur

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Lisez l'article que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p8...on_des_donnees

    Sinon, CHANGE TRACKIN ou CHANGE DATA CAPTURE sont deux outils pour ce faire, mais plus orientés DW.

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

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2013
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour, et merci pour vos réponses

    Suite à un changement d'avis du client, je n'ai pas eu a effectué l'historique de cette manière. Néanmoins, si j'avais eu à continuer, j'aurais opté pour un DATA CHANGE CAPTURE qui aurait résolu tout mes problèmes.

    C'est donc Résolu pour ma part

    Merci encore

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

Discussions similaires

  1. [Débutant] Affecter une variable d'une classe C# à une variable Javascript
    Par SultanGeek dans le forum C#
    Réponses: 0
    Dernier message: 20/06/2015, 20h42
  2. XL 2007: Remplacer des valeurs par d'autres sur une autre feuille
    Par redhotchilipeppers dans le forum Excel
    Réponses: 2
    Dernier message: 26/11/2014, 11h23
  3. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  4. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  5. [C# 2.0] Récupérer une variable sur une autre fenêtre
    Par herrs dans le forum Windows Forms
    Réponses: 5
    Dernier message: 14/11/2006, 00h24

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