Comment puis-je modifier les valeurs d'une INSERTION dans un trigger sur SQL Server?
J'ai la table Tb
ID | Name | Desc
-------------------------
1 | Sample | sample desc
Je veux créer un trigger sur INSERT qui permet de changer la valeur de l'insertion Desc
, par exemple:
INSERT INTO Tb(Name, Desc) VALUES ('x', 'y')
Entraînera
ID | Name | Desc
-------------------------
1 | Sample | sample desc
2 | x | Y edited
Dans l'exemple ci-dessus j'ai eu la valeur de l'insertion Desc
changé en majuscules et ajouté edited
sur la fin.
C'est ce dont j'ai besoin, obtenir l' Desc
en cours d'insertion et de le modifier.
Comment puis-je le faire?
Est-il préférable de le gérer après l'insertion avec une mise à jour? Ou faire un déclencheur INSTEAD OF INSERT et de le modifier à chaque fois le tableau des modifications de la structure?
- Ne pouvez-vous pas faire cela d'une manière différente? Personnellement, je déteste quand je vois des choses bizarres qui se passe sur les données, et j'ai finalement se rendre compte qu'un fantôme de déclenchement a été fait certains trucs
- Je vais l'utiliser pour résoudre un problème qui relève d'un code je n'ai pas accès. Il insère le
url
d'un article, mais elle ne supprime pas les accents et les caractères spéciaux, je vais faire un déclencheur de le faire pour moi. - Ce n'est pas un concept difficile et cela dépasse mon esprit que Microsoft ne peut pas fournir ces fonctionnalités simples comme dans Oracle, où vous pouvez modifier toutes les valeurs avant de les insérer en modifiant le :de NOUVELLES valeurs. c'est à dire si je veux toujours jeté les noms d'utilisateur à la partie supérieure avant de les insérer (en supposant que je ne peux pas le faire dans le code pour une raison quelconque), vous pourriez avoir un avant déclencheur d'insertion qui ne :NOUVEAU.nom d'utilisateur := MAJUSCULE(:NOUVEAU.nom d'utilisateur). Dans SQL Server, vous ne pouvez pas faire l'équivalent avec les valeurs de l'insertion de la table temporaire, et que c'est vraiment nul.
- Oui, vous le pouvez. Dans l'au lieu de déclencher, il suffit d'exécuter une instruction insert qui sélectionne toutes les colonnes de la table insérée dans la table réelle, mais de modifier l'sélectionnez la colonne que vous voulez faire de la supérieure. Par exemple, dans le déclencheur instead of insert, il suffit d'exécuter une instruction comme
insert into Table (a,b,c) select a, ToUpper(b), c from inserted
. Microsoft tech coups oracle hors de l'eau.
Vous devez vous connecter pour publier un commentaire.
Utiliser un après déclencheur d'insertion. Joindre la
inserted
pseudo table àTb
sur la clé primaire. Puis mettre à jour les valeurs de desc. Quelque chose comme: (Mais ne peut pas compiler)Ce déclenchement se fait après l'insertion s'est passé, mais avant
insert
instruction se termine. Ainsi, les nouveaux, des valeurs incorrectes sont déjà placés dans la table cible. Ce déclencheur n'aurez pas besoin de changer les colonnes sont ajoutés, supprimés, etc.Mise en garde contraintes d'Intégrité sont appliquées avant le après le déclenchement des incendies. Si vous ne pouvez pas mettre sur une contrainte check pour appliquer la bonne forme de DESC. Car que serait la cause de l'échec de l'instruction avant le déclenchement d'avoir une chance de réparer quoi que ce soit. (Veuillez vérifier ce point avant de vous y fier. Il a été un certain temps depuis que j'ai écrit un déclencheur.)
OUTPUT
clause de!Tb
ou la clause from doit êtrefrom Tb Trgt
. merci pour la capture de que.Je ne suis pas sûr de l'endroit où vous allez pour obtenir la nouvelle valeur pour les desc, mais je suppose que vous l'obtenir à partir d'une autre table ou quelque chose du genre. Mais vous avez probablement raison de vouloir faire de cette façon donc, ci-dessous est un exemple de la façon dont j'allais parler.
Ce que vous voulez est appelé un déclencheur INSTEAD OF INSERT, il le feu à la place d'un insert sur la table à ce que toute la logique de vous la donner.
J'ai codé en dur le mot "modifié" dans il que je ne suis pas sûr de l'endroit où vous voulez obtenir la valeur, mais vous pouvez facilement la remplacer par une variable ou une valeur à partir d'une autre table.
Oh assurez-vous aussi de le mettre le [] autour de Desc, comme il est un mot-clé dans sql server (pour la descente)
Espère que ça aide!
Edit:
Si vous voulez le rendre un peu plus robuste, de sorte qu'il ne dépend pas de la structure de la table comme beaucoup que vous pourriez utiliser un APRÈS déclencheur d'INSERTION pour juste les mises à jour de champ comme si.
Desc
et de le modifier. J'aurais dit que. Je vais mettre à jour ma question, désolé pour çaDe la table temporaire peuvent aider à utiliser
INSTEAD OF INSERT
déclencheur tout en évitant explicitement liste de tous indépendants des colonnes de la table:Ce code ne sera pas besoin d'être fixé lorsque de nouvelles colonnes sont ajoutées à la table.
Mais méfiez-vous de certains surcharge supplémentaire de tables temporaires.
Également noter que SQL Server déclenche le feu une fois pour un volume d'opérations DML et doit gérer correctement les multi-insertions de lignes.
#tmp
table à l'intérieur de déclenchement.Vous pouvez regarder la
INSTEAD OF
déclencheurs.Cela vous permettra de manipuler les données avant qu'il ne passe dans la table. Le déclencheur est chargé d'insérer les données de la table.