2010-04-30 7 views
3
ALTER TRIGGER [dbo].[TR_O_SALESMAN_INS] 
    ON [dbo].[O_SALESMAN] 
    AFTER INSERT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
    DECLARE @SLSMAN_CD NVARCHAR(20) 
    DECLARE @SLSMAN_NAME NVARCHAR(20) 
    SELECT @SLSMAN_CD = SLSMAN_CD,@SLSMAN_NAME=SLSMAN_NAME 
    FROM INSERTED 

    IF NOT EXISTS(SELECT * FROM O_SALESMAN_USER WHERE SLSMAN_CD = @SLSMAN_CD) 
    BEGIN 
     INSERT INTO O_SALESMAN_USER(SLSMAN_CD, PASSWORD, USER_CD) 
     VALUES(@SLSMAN_CD, @SLSMAN_CD,@SLSMAN_NAME) 
    END 
END 

Ceci est le déclencheur écrit pour un table(O_SALESMAN) chercher quelques colonnes de lui et l'insérer dans un autre table(O_SALESMAN_USER). Actuellement, les données en bloc sont insérées dans la table O_SALESMAN via une procédure stockée, alors que le déclencheur est déclenché une seule fois et O_SALESMAN_USER n'a qu'un seul enregistrement inséré à chaque fois que la procédure stockée est en cours d'exécution, je veux que le déclencheur s'exécute après chaque enregistrement qui est inséré dans O_SALESMAN de telle sorte que les deux tables doivent avoir le même nombre qui ne se produit pas ... alors s'il vous plaît laissez-moi savoir ce qui peut être modifié dans ce Trigger pour atteindre la même chose ....déclencheur de mise à feu pour vrac insérer

+0

vaudraient peut-être votre préciser si vous voulez dire INSERT VRAC (http: //msdn.mic rosoft.com/en-us/library/ms188365.aspx), où vous devez inclure FIRE_TRIGGERS, ou simplement une INSERT à plusieurs lignes (http://msdn.microsoft.com/fr-fr/library/ms174335.aspx) –

Répondre

1

Oui, déclenche une fois par déclenchement déclaration, pas une fois par rangée.

Vous avez donc besoin quelque chose comme:

SET NOCOUNT ON 

INSERT INTO O_SALESMAN_USER(SLSMAN_CD, PASSWORD, USER_CD) 
SELECT 
    i.SLSMAN_CD,i.SLSMAN_CD,i.SLSMAN_NAME 
FROM 
    inserted i 
     left join 
    O_SALESMAN_USER u 
     on 
      i.SLSMAN_CD = u.SLSMAN_CD 
where 
    u.SLSMAN_CD is NULL 
0

Mon scenerio est, (noms de table: Stock, StockLog)

J'insérer des lignes en vrac à l'intérieur table Stock par une procédure stockée et que vous souhaitez avoir aussi toutes ces lignes à l'intérieur de la table StockLog

premier je faisais même que vous (par des variables) dans mon déclencheur d'insertion pour la table d'actions mais obtenir erreur, car en utilisant

DECLARE @StocklId bigint 

SET @StocklId = (SELECT StocklId FROM inserted) 

j'avais plusieurs valeurs de (SELECT StocklId DE inséré) que j'insérait plusieurs lignes, puis supprimer toutes les variables, et maintenant que je fais ce

INSERT INTO StockLog(StocklId,PharmacyId,TransactionDetailId,ProductId,TotalQty,ReservedQty,AvailableQty,strUserName,strTerminalName,strVer) 

SELECT StocklId, PharmacyId, TransactionDetailId, ProductId, TotalQty, 0, AvailableQty,strUserName, strTerminalName, strVer FROM inserted 

et maintenant tout va bien

5

vous pouvez utiliser un curseur comme suit:

create trigger trg_insertstuff 
on [O_SALESMAN] 
after insert 
as 

    DECLARE @SLSMAN_CD NVARCHAR(20) 
    DECLARE @SLSMAN_NAME NVARCHAR(20) 


declare db_cursor CURSOR FOR 
SELECT SLSMAN_CD, SLSMAN_NAME 
from inserted 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @SLSMAN_CD , @SLSMAN_NAME 

WHILE @@FETCH_STATUS = 0 
BEGIN 

IF NOT EXISTS(SELECT * FROM O_SALESMAN_USER WHERE SLSMAN_CD = @SLSMAN_CD) 
    BEGIN 
     INSERT INTO O_SALESMAN_USER(SLSMAN_CD, PASSWORD, USER_CD) 
     VALUES(@SLSMAN_CD, @SLSMAN_CD,@SLSMAN_NAME) 
    END 


FETCH NEXT FROM db_cursor INTO @SLSMAN_CD , @SLSMAN_NAME 
end 

CLOSE db_cursor 
DEALLOCATE db_cursor 
+2

http://msdn.microsoft.com/fr-fr/library/ms190752.aspx "Nous ne recommandons pas l'utilisation de curseurs dans les déclencheurs, car ils peuvent potentiellement réduire les performances. Pour concevoir un déclencheur qui affecte plusieurs lignes, utilisez une logique basée sur l'ensemble de lignes au lieu de curseurs. " –

Questions connexes