2010-11-17 8 views
1

J'essaie de copier les données de la table "tb_A" vers lui-même (avec une clé primaire différente).Comment utiliser FIRE_TRIGGERS dans l'instruction insert sql

Lorsque la table "tb_A" est insérer un nouvel enregistrement, j'ai écrit un déclencheur pour remplir une autre table "tb_B" avec un enregistrement.

J'ai exécuté l'instruction suivante.

INSERT INTO [tb_A] 
     ([NAME]) 
select top (20)[NAME] from [tb_A] 

Je devais enregistrer 20 nouveaux enregistrements dans "tb_B". Mais je ne l'ai pas fait.

Quoi qu'il en soit, j'ai vu que FIRE_TRIGGERS est utilisé lors de l'insertion en vrac pour résoudre ce problème. est il y a un moyen de l'utiliser sur les instructions inset aussi? S'il vous plaît, donnez moi un exemple.

Gayan


code de déclenchement (copié sur le commentaire de Gayan à la réponse de GBN):

CREATE TRIGGER UpdatetbB ON [dbo].[tb_A] FOR INSERT 
AS 
    DECLARE @AID as int 
    SELECT @AID = [ID] FROM inserted 

    INSERT INTO [tb_B]([IDA]) VALUES (@AID) 
+0

Veuillez ajouter le code de déclenchement. – gbn

Répondre

1

FIRE_TRIGGERS est seulement pour INSERT VRAC (et bcp), et non "standard" INSERT

Je m'attendrais à ce que votre déclencheur ressemble à quelque chose comme

CREATE TRIGGER TRG_tbA_I ON tb_A FOR INSERT 
AS 
SET NOCOUNT ON 

INSERT tb_B (col1, col2, ...) 
SELECT col1, col2, ... FROM INSERTED 
GO 

Vous utilisez la table spéciale INSERTED pour obtenir la liste des nouvelles lignes dans tb_A, puis INSERT à partir de ceci dans tb_B. Cela fonctionne pour plus d'une ligne

Si vous ajoutez le code de déclenchement, nous pouvons expliquer ce qui s'est mal passé. Éditer: votre déclencheur lira seulement une rangée (n'importe quelle rangée, aucun ordre particulier) de INSÉRÉ. Ce n'est pas basé basé comme mon exemple approximatif.

+0

CREATE TRIGGER UpdatetbB ON [dbo]. [Tb_A] POUR INSERT AS DECLARE @AID comme int SELECT @AID = [ID] FROM inséré INSERT INTO [tb_B] ([IDA]) VALUES (@AID) c'est le déclencheur que j'ai utilisé pour effectuer cette tâche –

+0

CREER TRIGGER UpdatetbB ON [dbo]. [tb_A] pOUR INSERT AS DECLARE @AID int \t SELECT @AID = [ID] dE inséré \t INSERT INTO [tb_B] ([IDA]) \t \t VALEURS \t \t \t (@AID) –

+0

Vous avez besoin d'un déclencheur comme gbn ci-dessus. Le vôtre ne fonctionnera que si la pseudo-table insérée a une seule ligne –

2

La raison pour laquelle votre déclencheur n'a pas fonctionné correctement est qu'il est mal conçu. Les déclencheurs se déclenchent une fois pour chaque insertion, même si vous insérez un million d'enregistrements. Vous avez un déclencheur qui fait l'hypothèse qu'il va enregistrer un enregistrement à la fois. Chaque fois que vous définissez un formulaire de valeur inséré ou supprimé dans une variable scalaire, le déclencheur est incorrect et doit être réécrit. Essayez quelque chose comme ça à la place.

CREATE TRIGGER UpdatetbB ON [dbo].[tb_A] FOR INSERT 
AS 

    INSERT INTO [tb_B]([IDA]) 
    SELECT [ID] FROM inserted