OVH Cloud OVH Cloud

trigger infos

3 réponses
Avatar
Christophe
Bonjour,

j'ai un trigger qui se lance sur un insert, un delete, un update

il renseigne une table avec differentes infos comme, login, host_name()
etc...


j'ai rajouté aussi 2 champs
le premier c'est les colonnes concernées par le trigger
je me sert de columns_updated()

et voila du coup j'ai 2 questions !

la premiere j'ai un champ qui indique l'action (delete, insert, update)
comment connaitre l'action qui à declancher le trigger (insert, delete,
update ) vu que ce dernier se declanche sur les 3 actions ?

La 2eme c'est comment avec le champ binary columns_updated(), récupérer
les champs mis à jour ?
Style , 1,2,3,4 ou alors 'Titre', 'datecreation', etc...


Merci par avance !
Ch.

3 réponses

Avatar
Rudi Bruchez
Christophe a écrit:

la premiere j'ai un champ qui indique l'action (delete, insert, update)
comment connaitre l'action qui à declancher le trigger (insert, delete,
update ) vu que ce dernier se declanche sur les 3 actions ?



Bonjour,

En testant les pseudo-tables inserted et deleted. si inserted est vide,
c'est un delete, si deleted est vide, c'est un insert, si les deux
contiennent des données, c'est un update.

Attention avec columns_updated() : il te donne les colonnes qui font partie
de la mise à jour, pas forcément celles qui ont réellement été modifiées.
C'est un bitmask, tu dois donc tester les bits contre la position des
colonnes que tu peux obtenir avec ORDINAL_POSITION de la vue
INFORMATION_SCHEMA.COLUMNS. Attention si tu es sur SQL 2005 :

Selon l'aide en ligne SQL 2005 :

Dans SQL Server 2005, la colonne ORDINAL_POSITION de la vue
INFORMATION_SCHEMA.COLUMNS n'est pas compatible avec le modèle binaire des
colonnes retournées par COLUMNS_UPDATED. Pour obtenir un modèle binaire
compatible avec COLUMNS_UPDATED, référencez la propriété ColumnID de la
fonction système COLUMNPROPERTY lorsque vous interrogez la vue
INFORMATION_SCHEMA.COLUMNS

Il y a un exemple dans l'aide en ligne, sous COLUMNS_UPDATED()

Un exemple pour tester les lignes qui ont vraiment été changées :

SELECT *
FROM (SELECT CHECKSUM(*) as chksum, * FROM inserted) i
JOIN (SELECT CHECKSUM(*) as chksum, * FROM deleted) d ON i.id = d.id
WHERE i.chksum <> d.chksum



--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
Solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/
Avatar
Christophe
Ok il n'y a aucun moyen de savoir si c'est une action de type Update, insert
ou deleted à part tester leur contenu ???
bizarre ca quand meme !

Sinon je ne suis pas arreté sur le columns updated, j'aimerais juste
connaitre les champs affectés par un update ?
si il'y a un moyen de faire autrement je suis super open sur le sujet !

et je ne suis pas encore sur 2005,enfin pas les serveur les plus importants
pour le moment !

Ces demarches me parraissent lourde pour pouvoir les placer dans un trigger
dont la table risque d'avoir quelques millions de lignes qu'en penses tu ?
Ch.

ps : j'ai pas bien pigé pour recuperer le champ, concerné par le mask ?




"Rudi Bruchez" <"rudi#nospam#[at]babaluga.com"> a écrit dans le message de
news:15sl1pwlpcpf9$
Christophe a écrit:

> la premiere j'ai un champ qui indique l'action (delete, insert,


update)
> comment connaitre l'action qui à declancher le trigger (insert,


delete,
> update ) vu que ce dernier se declanche sur les 3 actions ?

Bonjour,

En testant les pseudo-tables inserted et deleted. si inserted est vide,
c'est un delete, si deleted est vide, c'est un insert, si les deux
contiennent des données, c'est un update.

Attention avec columns_updated() : il te donne les colonnes qui font


partie
de la mise à jour, pas forcément celles qui ont réellement été modifiées.
C'est un bitmask, tu dois donc tester les bits contre la position des
colonnes que tu peux obtenir avec ORDINAL_POSITION de la vue
INFORMATION_SCHEMA.COLUMNS. Attention si tu es sur SQL 2005 :

Selon l'aide en ligne SQL 2005 :

Dans SQL Server 2005, la colonne ORDINAL_POSITION de la vue
INFORMATION_SCHEMA.COLUMNS n'est pas compatible avec le modèle binaire des
colonnes retournées par COLUMNS_UPDATED. Pour obtenir un modèle binaire
compatible avec COLUMNS_UPDATED, référencez la propriété ColumnID de la
fonction système COLUMNPROPERTY lorsque vous interrogez la vue
INFORMATION_SCHEMA.COLUMNS

Il y a un exemple dans l'aide en ligne, sous COLUMNS_UPDATED()

Un exemple pour tester les lignes qui ont vraiment été changées :

SELECT *
FROM (SELECT CHECKSUM(*) as chksum, * FROM inserted) i
JOIN (SELECT CHECKSUM(*) as chksum, * FROM deleted) d ON i.id = d.id
WHERE i.chksum <> d.chksum



--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
Solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/


Avatar
Rudi Bruchez
Christophe a écrit:

Ok il n'y a aucun moyen de savoir si c'est une action de type Update, insert
ou deleted à part tester leur contenu ???
bizarre ca quand meme !



il y a un moyen, c'est justement celui-là ;) Il n'y a pas d'autre
indicateur.

Sinon je ne suis pas arreté sur le columns updated, j'aimerais juste
connaitre les champs affectés par un update ?
si il'y a un moyen de faire autrement je suis super open sur le sujet !



que veux-tu dire par "affecté" ? Que la colonne apparaît dans le SET d'un
update, ou que sa valeur est changée réellement ? columns_updated() te
donne la première version, même si la nouvelle valeur est la même que
l'ancienne.

Ces demarches me parraissent lourde pour pouvoir les placer dans un trigger
dont la table risque d'avoir quelques millions de lignes qu'en penses tu ?



Ca dépend ce que tu fais dans ton trigger. Requêter inserted ou deleted
n'est pas plus lourd si tu a deux lignes ou deux millions, à moins bien sûr
que tu fasses un update sans clause WHERE...

ps : j'ai pas bien pigé pour recuperer le champ, concerné par le mask ?



As-tu lu l'aide en ligne (BOL) sous CREATE TRIGGER ? Il y a des exemples.

--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
Solutions MS SQL Server et informatique libre.
MCDBA, SCJP2
http://www.babaluga.com/