2016-11-27 5 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'); 

все отделены друг от друга. Когда я запускаю этот код, таблица LogM будет заполнена 20 новых строками этого типа:

5 Nov 27 2016 8:58PM Avion Inserare 1.00 

Я хочу, чтобы мой курок, чтобы сосчитать все вставки, хранящиеся в процедуре, а затем вставить в LogM только одну записи , с ROWCOUNT не будучи 1.00, но количество вставки я сделал в этой хранимой процедуры, и я не имею ни малейшего представления, как я могу это сделать.

спасибо.

+0

И как сервер sql должен знать, что пришло время вставить данные в таблицу журналов? Я хотел бы предложить, чтобы chsnge логику в вашем прок и вставить все строки с помощью одного оператора –

+0

Ваш триггер ** MAJOR ** недостаток в том, что вы, кажется, предположить, что это будет называться ** один раз в строке ** - то есть * *не тот случай. Триггер будет срабатывать ** один раз за оператор **, поэтому, если ваш оператор 'INSERT', который вызывает этот триггер для запуска вставки 25 строк, вы получите триггер, запущенный ** один раз **, но тогда псевдо-таблица' Inserted' будет содержат 25 строк. Какой из этих 25 строк будет выбран ваш код? 'ВЫБРАТЬ @codAv = INSERTED.codA FROM INSERTED' - это недетерминировано, вы получите ** один произвольный ряд **, и вы будете ** игнорируя все остальные строки **. Вам необходимо переписать триггер, чтобы учесть это –

ответ

1

Вместо передачи @@ ROWCOUNT вы не можете просто передать идентификатор?

@@ 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 
Смежные вопросы