octobre
2007
Comme m’avait prévenu Cédric, il faut faire attention à ce que la couche DAL ne fasse pas un Update avec un SET sur toutes les colonnes, y compris celles qui n’ont pas changé (dans ce cas là, il réaffecte la même valeur).
Et c’est le cas du SQLDataAdapter généré via le designer du DataSet.
Du coup, soit je gère moi-même le SQLDataAdapter, soit je dis adieu à mon joli trigger.
Dans ce dernier cas, il va falloir tester la valeur de toutes les colonnes.
Du coup mon trigger ne doit plus se déclencher après le update mais avant. Je ne sais pas ce qu’il en est en SQL Server 2005 mais en tout cas, en SQL Server 2000, je ne peux pas faire BEFORE UPDATE. Du coup, je vais faire un INSTEAD OF.
Mais le problème principal, c’est que c’est nul de tester toutes les colonnes en dur. En effet, si la table change, mon trigger ne fonctionne plus. L’idée est donc de faire des tests dynamiques et là c’est Guillaume qui m’a aidé. (j’aurais bientôt mis à contribution tout le pôle DataManagement )
L’idée est de faire un CURSOR :
SELECT name
FROM sys.syscolumns
WHERE id=OBJECT_ID('Toto')
AND name <> 'ExportedDate'
Et tester si la valeur est différente pour chacune des colonnes.
Le problème c’est que je ne peux pas faire
WHERE Inserted.@columnName <> Toto.@columnName
(trop fort le mailto :)))
Pour cela, je vais utiliser
EXEC sp_executesql @sql,N'@diff INT OUTPUT', @diff OUTPUT
avec @sql la requête en nvarchar.
Si @diff (bit) est vrai alors il me reste plus qu’à faire le UPDATE sur la colonne (le INSTEAD OF ne le fait pas) et renseigner ExportedDate.