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...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/
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/
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/
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/
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$.1uackoopkk627.dlg@40tude.net...
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/
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/
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/
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/
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/