2010-06-30 3 views
2

J'ai un déclencheur qui est utilisé pour auditer les lignes insérées, mises à jour et supprimées. J'ai un problème avec l'acquisition des anciennes valeurs et des nouvelles valeurs à partir du déclencheur. Le déclencheur utilise une boucle pour insérer toutes les valeurs d'une ligne qui a été modifiée de quelque façon que ce soit (insérée, mise à jour, supprimée). Cependant, mon code ne renvoie pas les valeurs mais les noms de colonnes en tant que valeurs.Le déclencheur de mise à jour/suppression SQL ne fonctionne pas correctement

Voici une partie de mon code:

SELECT @COLNAME = NAME 
FROM SYSCOLUMNS 
WHERE COLID = @FIELD AND 
    ID = (SELECT ID FROM SYSOBJECTS WHERE NAME = 'FIN_HOTEL_DTL_TYPE') 
SELECT @OLDVAL = SUBSTRING(@COLNAME, 2, LEN(@COLNAME)) FROM DELETED 
SELECT @NEWVAL = SUBSTRING(@COLNAME, 2, LEN(@COLNAME)) FROM INSERTED 
SELECT @MODBY = MODIFIED_BY FROM INSERTED 
SELECT @MODDT = MODIFIED_DATETIME FROM INSERTED 

Répondre

3

T-SQL est juste un autre monde.

Votre code fait exactement ce que vous lui avez demandé de faire. @ColName n'est pas une référence à un objet de colonne, mais une variable contenant une valeur de chaîne que vous avez chargée avec le nom d'une colonne.

Je suggère que vous regardez un example. Lisez le tout si vous le souhaitez, mais si vous êtes pressé, descendez jusqu'à l'expression CREATE TRIGGER Audit.

De même, prenez le temps de le faire avec une logique basée sur un ensemble - comme dans l'exemple. Exploitez la puissance et les performances du SGBD en utilisant T-SQL et en lâchant les liens du codage ligne par ligne. Pas vraiment. Boucles codées = performance médiocre. Si nécessaire, le SGBD implémentera des boucles (ou ce qu'il souhaite) en arrière-plan.

Bonne chance!


J'essayais de trouver ce lien plus tôt. Je crois que this posting par Paul Nielsen est assez proche de ce que vous voulez.

+0

Ouais, je pensais autant au @ColName. J'utilisais ce type de logique parce que certaines des tables ont beaucoup de colonnes (ancienne DB, pas mon choix malheureusement) et je ne voulais pas avoir à coder chaque colonne. – mattgcon

+0

Belle réponse, et en particulier la partie sur éviter de faire cela en boucle. J'ai mis en œuvre des déclencheurs similaires, et ils sont plus courts et plus simples sans la boucle, en plus de faire mieux. – TimothyAWiseman

+0

Nous vous remercions de votre aide. J'ai sorti la boucle et j'ai simplement référencé les colonnes individuellement. – mattgcon

Questions connexes