Créer un Déclencheur qui permettra d'insérer un enregistrement dans une table sur la mise à jour d'une autre table
Supposons que j'ai les tables T1 et T2
Columns of T1 -->Value
Columns of T2 -->OldValue NewValue
Ce que je besoin est un déclencheur qui va insérer un enregistrement dans T2 sur la mise à jour de T1 , j'ai besoin de savoir l'ancienne valeur et la nouvelle valeur aussi , je n'ai jamais utilisé déclenche avant , donc peut m'aider avec ça , comment dois-je aller sur la création de ce déclencheur.Est-il possible ,merci.
OriginalL'auteur Priyank Patel | 2012-05-18
Vous devez vous connecter pour publier un commentaire.
Bien, vous commencez à écrire un déclencheur de la
CREATE TRIGGER
:La table, qui devrait déclencher l'action supplémentaire est
T1
donc le déclencheur doit être définiON
de la table:L'action que le déclencheur doit être appelée sur est
UPDATE
et le timing estAFTER
la mise à jour, donc...C'est maintenant le temps de présenter le corps de la gâchette, c'est à dire les états qui doit être exécutée par le déclencheur. Vous introduisez le corps avec le
AS
mot-clé suivi par les états eux-mêmes.Dans votre cas, il y aurait juste une seule déclaration,
INSERT
, ce qui est évident. Ce n'est pas si évident, c'est la façon dont nous allons accéder à l'ancienne et les nouvelles valeurs. Maintenant, SQL Server vous offre deux tables virtuelles,INSERTED
etDELETED
, et vous pouvez facilement deviner que le premier contient toutes les nouvelles valeurs et les derniers les vieilles.Ces tables ont la même structure que la table le déclencheur est affecté, c'est à dire
T1
. Elles contiennent uniquement les lignes qui ont été affectés par le particulierUPDATE
déclaration qui a appelé le déclencheur, ce qui signifie qu'il peut être plus d'un. Et qui, à son tour, signifie que vous besoin d'avoir une clé primaire ou une colonne unique (ou un ensemble de colonnes) dans votreT1
table que vous pouvez utiliser dans le déclenchement de match supprimés et les lignes insérées. (En fait, vous pourriez aussi avoir besoin de votreT2
table pour avoir une colonne qui référence laT1
's de la clé primaire, de sorte que vous pourrait par la suite d'établir la ligne deT1
avait les valeurs stockées dansT2
.)Pour les fins de cette réponse, je vais supposer qu'il y a une colonne de clé primaire appelé
PK
et une colonne de clé étrangère du même nom dansT2
. Et leINSERT
déclaration pourrait alors ressembler à ceci:Une dernière (mais pas la moindre chose à retenir: l'ensemble de la
CREATE TRIGGER
déclaration doit être le seul dans le lot, c'est à dire il devrait y avoir pas de déclarations précédant laCREATE TRIGGER
mots-clés (mais vous pouvez mettre des commentaires), et, de même, tout ce qui est après leAS
mot-clé est considéré comme faisant partie de la détente du corps (mais vous pouvez mettre leGO
délimiteur pour indiquer la fin de la déclaration, si vous exécutez le script dans SQL Server Management Studio, par exemple).Utile de lecture:
Les deux
inserted
etdeleted
va contenir toutes les colonnes. L'affectés valeurs seront présents dans les deux tables, les concernés ne diffèrent en conséquence.ici, je n'ai qu'une Valeur de champ , si j'ai beaucoup de champs , alors comment puis-je obtenir de nouvelles valeurs pour toutes les colonnes , tous les indicateurs
Pas sûr que je comprends ce qui vous trouble, désolé. Soit
inserted
oudeleted
aura autant de colonnes qu'il y a dansT1
. Vous pouvez faire référence à une de ces colonnes dansinserted
, qui sera la valeur(s) après la mise à jour, tout en faisant référence à la même colonne(s) dansdeleted
vous donnera la valeur(s) avant la mise à jour. LeSELECT
de la clause ci-dessusINSERT
déclaration pourrait être quelque chose comme ceci:SELECT i.PK, i.Column1, Column2, …, d.Column1, d.Column2, …
. Comme je l'ai dit, certaines valeurs dansinserted
seront les mêmes que les valeurs correspondantes dansdeleted
si la mise à jour n'a pas changé.Je me demandait si je voulais savoir lequel toutes les colonnes ont été mise à jour alors je dois écrire je.col1,j'.col2,j'.col3,...... et ainsi de suite jusqu'à mon dernier article.J'espère que vous comprenez ce que je demande
OriginalL'auteur Andriy M
Je ne vais pas construire l'ensemble de la chose pour vous (pas de plaisir, pas vrai?) mais je peux vous diriger dans la bonne direction
rappelez-vous que SUPPRIMÉS et sont INSÉRÉS les tables internes qui contient les anciennes et les nouvelles valeurs. Sur un déclencheur de mise à jour, tant qu'ils existent. Sur un déclencheur d'insertion, SUPPRIMÉ sera nulle, car il n'y a rien supprimer. Même logique sur un déclencheur de suppression, l'insertion sera vide
EDIT:
de répondre à votre question: peu importe combien de champs de mise à jour, SUPPRIMÉES et INSÉRÉS les tables que vous avez toutes les colonnes de toutes les lignes concernées. Bien sûr, si vous mettez à jour une seule colonne, tous les autres auront la même valeur sur l'SUPPRIMÉ et INSÉRÉ
non, voir mon edit
OriginalL'auteur Diego
OriginalL'auteur Alexis Stap