Bonjour
Existe-il un mecanisme permettant lors d'un Update de detecter si des champs sont reellement affectés (modifies) ?
Merci de votre aide
Version imprimable
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:
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:
1
2 UPDATE T SET C = C
A +
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 valeur ;)Citation:
Envoyé par SQLPro
@++ ;)
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...
L'un n'exclut pas l'autreCitation:
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?
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
ok...
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 ?Citation:
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.
@++ ;)
Bonjour, excusez moi pour le temps de réponse.
J'avais initialement prévu de faire ceci :
L'idée était de boucler sur chacune des colones afin d'en récupérer les valeurs et de créer une requete string.Code:
1
2
3
4
5
6
7
8
9
10 DECLARE @MYVAL nvarchar(255) DECLARE@Champ nvarchar(255) DECLAIRE @i integer -- Cette Requete retourne : "DIV_CODE_SOURCE" qui est un nom de column (Pour @i = 1) SELECT @Champ = COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'DOS_DOSSIER' AND ORDINAL_POSITION = @i -- Voudrait récupérer la valeur du champ si modifié. Mais ne récupère rien. SELECT @MYVAL = (SELECT @champ FROM INSERTED)
J'avais pensé à ceci car les requêtes que je récupère sont paramétré et j'ai donc que de @Param1 @Param2 ..
A+