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 :

Detecter les modification lors d'un Update


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Detecter les modification lors d'un Update
    Bonjour

    Existe-il un mecanisme permettant lors d'un Update de detecter si des champs sont reellement affectés (modifies) ?

    Merci de votre aide

  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 : 44
    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
    Par défaut
    Bonjour,

    Le seul moyen est de comparer les tables virtuelles inserted et deleted :

    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
    ALTER TRIGGER dbo.TR_AU_unetable
    	ON dbo.unetable
    AFTER UPDATE
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	IF EXISTS
    	(
    		SELECT		*
    		FROM		inserted AS I
    		INNER JOIN	deleted AS D
    					ON I.column_1 <> D.column_1
    					OR I.column_x <> D.column_x
    					....
    					OR I.column_n <> D.column_n
    	)
    	BEGIN
    		-- traitement
    	END
    END
    Suivant le contexte, on peut probablement filtrer le changement à l'aide de la fonction COLUMNS_UPDATED() ...

    Si c'est pour un audit de changement de données sur beaucoup de tables et que vous êtes sous SQL Server 2008, je vous conseille vivement d'utiliser une des fonctionnalités suivantes selon vos besoins :

    - Change Data Capture
    - Change Tracking
    - Database Audit

    Qui sont bien plus légères et performantes qu'un trigger.

    @++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Dans un trigger, oui et non :
    1) fonction UPDATE(MaColonne) => True/false
    2) fonction COLUMNS_UPDATED(masque_binaire1) & / | masque_binaire2
    Mais si je fais :
    alors UPDATE(C) => true !

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

  4. #4
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci a vous

    Comme je travaille en C# avec des classes dédiées aux acces DB j'ai finalement choisi de tester les modifications au niveau des accesseurs de ces classes;

  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 : 44
    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
    Par défaut
    Citation Envoyé par SQLPro
    alors UPDATE(C) => true !
    Il en va de même avec COLUMNS_UPDATED(), qui retourne les colonnes mises à jour même si la colonne ne change pas de valeur

    @++

  6. #6
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Comme je travaille en C# avec des classes dédiées aux acces DB j'ai finalement choisi de tester les modifications au niveau des accesseurs de ces classes;

    Que se passera t'il si entre le moment ou vous avez chargé votre objet et le moment ou vous le modifiez un autre utilisateur à modifié les données?

    Utilisez vous un ORM? car LTS et LTE le font via le datacontext et le tracking d'objet...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Le seul moyen est de comparer les tables virtuelles inserted et deleted :

    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
    ALTER TRIGGER dbo.TR_AU_unetable
    	ON dbo.unetable
    AFTER UPDATE
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	IF EXISTS
    	(
    		SELECT		*
    		FROM		inserted AS I
    		INNER JOIN	deleted AS D
    					ON I.column_1 <> D.column_1
    					OR I.column_x <> D.column_x
    					....
    					OR I.column_n <> D.column_n
    	)
    	BEGIN
    		-- traitement
    	END
    END
    Suivant le contexte, on peut probablement filtrer le changement à l'aide de la fonction COLUMNS_UPDATED() ...

    Si c'est pour un audit de changement de données sur beaucoup de tables et que vous êtes sous SQL Server 2008, je vous conseille vivement d'utiliser une des fonctionnalités suivantes selon vos besoins :

    - Change Data Capture
    - Change Tracking
    - Database Audit

    Qui sont bien plus légères et performantes qu'un trigger.

    @++

    Bonjour,

    Comment faire si je veux récupérer la valeur d'une seule colonne dont le nom se trouve dans une variable ?
    Je ne récupère que la valeur présente dans cette variable.. rien d'autre.

    Merci

  8. #8
    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 : 44
    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
    Par défaut
    Bonjour,

    Ce n'est pas possible : un déclencheur est un cas particulier de procédure stockée qui ne prend aucun paramètre en entrée. La seule possibilité c'est que vous ayez besoin de toujours récupérer la même colonne, auquel cas on peut stocker son nom dans une table utilitaire servant ce but.

    @++

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Par défaut
    Bonjour,

    J'ai cru comprendre qu'en effet j'étais bloqué avec la solution que je souhaitais mettre en place...

    Cependant, plus à titre personnel maintenant, j'aurais voulu savoir quelle était la différence entre récupérer le nom de la colonne stockée dans une table et le récupérer depuis une variable qui aura été instanciée grâce à l'information_schéma.columns d'une table.

    Je me retrouverais quoi qu'il arrive avec un nvarchar et ne comprend pas en quoi cela sera plus exploitable..

    C'est vraiment pour ma culture SQL car quoi qu'il en soit je dois récupérer le nom de plusieurs colonnes.

    Merci de m'avoir répondu.

  10. #10
    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 : 44
    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
    Par défaut
    Cependant, plus à titre personnel maintenant, j'aurais voulu savoir quelle était la différence entre récupérer le nom de la colonne stockée dans une table et le récupérer depuis une variable qui aura été instanciée grâce à l'information_schéma.columns d'une table.
    Pouvez-vous donner le code d'affectation de la variable ?

    @++

Discussions similaires

  1. [AC-2003] Detecter les modification
    Par DonKnacki dans le forum IHM
    Réponses: 1
    Dernier message: 22/04/2011, 15h30
  2. Detecter les modifications dans un formulaire
    Par Maheu dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/08/2008, 17h56
  3. Réponses: 5
    Dernier message: 14/01/2007, 21h28
  4. [Conception] Mettre a jour tout les champs d'un table lors d'un update
    Par metatron dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 27/09/2006, 15h29
  5. Réponses: 1
    Dernier message: 31/07/2006, 13h51

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