2016-11-27 1 views
1

로그 테이블에 날짜, 삽입 된 테이블의 이름, 작업 이름 (삽입, 삭제, 업데이트) 및 삽입 횟수를 삽입하는 트리거를 작성하려고합니다.SQL 서버에 트리거 삽입

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

모두 서로 분리 :이 유형의 20 삽입과 같은이 어디 저장 프로 시저를

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 

:

여기 내 코드입니다.

5 Nov 27 2016 8:58PM Avion Inserare 1.00 
I 프로 시저에 저장된 모든 삽입을 계산하는 내 트리거를 만들고 싶어

는 다음 LogM 하나 개의 항목에 삽입 : 그 코드를 실행하면 테이블 LogM이 유형의 20 새 행으로 채워집니다 , ROWCOUNT1.00이 아니지만이 저장 프로 시저에서 삽입 한 횟수는 얼마이며 어떻게 할 수 있는지 알지 못합니다.

감사합니다.

+0

그리고 logm 테이블에 데이터를 삽입 할 시간을 SQL Server가 알아야합니다. 귀하의 proc에 논리를 chsnge하고 하나의 문장으로 모든 행을 삽입하는 것이 좋습니다 –

+0

귀하의 방아쇠는 ** 당신이 그것이 행 ** 당 한 번 ** 호출 될 거라는 가정에있는 것으로 보이는 결함 - ** * * ** 사건이 아닙니다. 트리거는 ** 명령문 ** 당 한 번 실행됩니다. 따라서이 트리거로 인해 발생하는 INSERT 문이 25 개의 행을 삽입하면 ** 한 번 ** 트리거가 발생하지만'Inserted' 의사 테이블은 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