Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/06/2011, 09h19   #1
Membre Expert
 
Inscription : octobre 2007
Messages : 3 947
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 947
Points : 1 905
Points : 1 905
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
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2011, 18h34   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

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

Code :
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.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2011, 22h02   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2011, 23h00   #4
Membre Expert
 
Inscription : octobre 2007
Messages : 3 947
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 947
Points : 1 905
Points : 1 905
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;
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 05h25   #5
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 09h05   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 11h19   #7
Membre Expert
 
Inscription : octobre 2007
Messages : 3 947
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 947
Points : 1 905
Points : 1 905
Citation:
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?
L'un n'exclut pas l'autre
On peut concevoir un controle de modification par l'utilisateur et nécessitant le cas échéant une mise a jour (c'est ce que je fais)

Le contrôle de colision avec un autre utilisateur peut se faire a un autre niveau
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 11h24   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
ok...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h47.


 
 
 
 
Partenaires

Hébergement Web