Bonjour
Existe-il un mecanisme permettant lors d'un Update de detecter si des champs sont reellement affectés (modifies) ?
Merci de votre aide
Bonjour
Existe-il un mecanisme permettant lors d'un Update de detecter si des champs sont reellement affectés (modifies) ?
Merci de votre aide
Bonjour,
Le seul moyen est de comparer les tables virtuelles inserted et deleted :
Suivant le contexte, on peut probablement filtrer le changement à l'aide de la fonction COLUMNS_UPDATED() ...
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
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.
@++![]()
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 !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 UPDATE T SET C = C
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/ * * * * *
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;
Il en va de même avec COLUMNS_UPDATED(), qui retourne les colonnes mises à jour même si la colonne ne change pas de valeurEnvoyé par SQLPro
@++![]()
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...
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.
@++![]()
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.
Pouvez-vous donner le code d'affectation de la variable ?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.
@++![]()
Partager