2010-12-09 47 views
3

Niveau supérieur J'ai deux tables dont certaines données doivent être mises en miroir. Je ne peux pas passer à travers et changer tout le code pour écrire à la fois, donc je pensais que j'utiliserais un déclencheur SQL pour insérer des données dans la 2ème table chaque fois que des données sont insérées dans le 1er. Voici où je suis coincé:Déclencheur SQL Server lors de l'insertion et comment référencer les données insérées

CREATE TRIGGER new_trigger_INSERT 
ON old_table 
FOR INSERT 
INSERT INTO new_table (id, first_name, last_name) 
VALUES() --This is where I'm lost, I need to insert some of the data from the insert that executed this trigger 

Toute aide est appréciée, même s'il y a une meilleure façon d'y arriver laissez-moi savoir.

Répondre

11

Utilisez le tableau 'inséré':

CREATE TRIGGER new_trigger_INSERT 
ON old_table 
FOR INSERT 
INSERT INTO new_table (id, first_name, last_name) 
SELECT col1, col2, col3 FROM inserted 

[PS: Ne pas oublier de vous assurer que vos déclencheurs gérer plusieurs lignes ...]

Ref. Create Trigger

Bon article: Exploring SQL Server Triggers

+1

Merci, je ne savais pas que ces tables existaient. Que voulez-vous dire en vous assurant que le déclencheur gère plusieurs lignes? – jon3laze

+7

@ jon3laze: une erreur courante commise par beaucoup de "newbies de déclenchement" est de supposer que le trigger sera déclenché une fois pour chaque ligne insérée - donc ils supposent que la table "Inserted" ne contiendra qu'une seule ligne. Ce n'est pas ainsi que ça fonctionne - si vous insérez un lot de 50 lignes, votre déclencheur INSERT sera déclenché ** une fois ** pour tout le lot, et le tableau "Inséré" contiendra 50 lignes - vous devez être en mesure de faire face à ce scénario –

1

Dans les déclencheurs que vous avez "insérés" et tables "supprimés". Dans ce cas, vous n'utilisez que le tableau "inséré", mais dans le déclencheur de mise à jour vous utilisez les deux.