2016-11-27 196 views
1

我想寫一個觸發器,它在日誌表中插入日期,插入的表的名稱,操作的名稱(插入,刪除,更新)和插入次數。在SQL Server中插入觸發器

這裏是我的代碼:

CREATE TRIGGER [dbo].[Inser] 
ON [dbo].[Avion] 
AFTER INSERT 
AS 
BEGIN 
    DECLARE @codAv int 
    DECLARE @NumeAv varchar(100) 
    DECLARE @MotorAv varchar(100) 

    SELECT @codAv = INSERTED.codA FROM INSERTED 
    SELECT @NumeAv = INSERTED.NumeA FROM INSERTED 
    SELECT @MotorAv = INSERTED.Motor FROM INSERTED 

    SELECT @@ROWCOUNT AS INSERTED; 

    INSERT INTO LogM (DataM, Numele, Tipul, Numar) 
    VALUES(GETDATE(), 'Avion', 'Inserare', @@ROWCOUNT); 

    PRINT 'INSERT trigger fired.' 
END 

我有一個存儲過程,我有這樣的事20插入這種類型的:

INSERT INTO Avion (Motor,NumeA) 
VALUES ('Junkers','Focke-Wulf'); 

都彼此分開。當我運行的代碼,表10gm的將這種類型的20個新行填充:

5 Nov 27 2016 8:58PM Avion Inserare 1.00 

我想讓我的觸發計數存儲在一個過程中的所有廣告,然後在LogM只有一個條目插入,ROWCOUNT不是1.00,但是我在該存儲過程中所做的插入次數,我不知道該怎麼做。

謝謝。

+0

以及sql服務器應該如何知道是時候將數據插入到logm表中了?我建議chsnge在你的過程中的邏輯和插入所有行的一個語句 –

+0

您的觸發器有**主要**缺陷,你似乎認爲它會被稱爲**每行一次** - 這是* *不是**的情況。觸發器將在每個語句**觸發一次**,所以如果你的引發這個觸發器觸發的INSERT語句插入了25行,你將觸發**觸發**一次,但是隨後插入的僞表將會包含25行。您的代碼在這25行中選擇哪一個? 'SELECT @codAv = INSERTED.codA FROM INSERTED' - 它是非確定性的,你將得到**一個任意的行**,你將**忽略所有其他行**。你需要重寫你的觸發器來考慮這一點 –

回答

1

而不是通過@@ ROWCOUNT你不能只傳遞ID?

@@ ROWCOUNT用於返回受影響的行數,因爲您一次輸入一個,它總是一個。

CREATE TRIGGER [dbo].[Inser] 
    ON [dbo].[Avion] 
    AFTER INSERT 
    AS 
    BEGIN 
    DECLARE @codAv int 
    DECLARE @NumeAv varchar(100) 
    DECLARE @MotorAv varchar(100) 

    SELECT @codAv=INSERTED.codA FROM INSERTED 
    SELECT @NumeAv=INSERTED.NumeA FROM INSERTED 
    SELECT @MotorAv=INSERTED.Motor FROM INSERTED  

    INSERT INTO LogM 
      (DataM,Numele,Tipul,Numar) 
    VALUES(GETDATE(),'Avion','Inserare',@codAv); 
    PRINT 'INSERT trigger fired.' 
END