2015-12-19 2 views
0

Я создал триггер для регистрации всех обновленных строк либо одной или нескольких строк, либо журнала обновленных строк в другую таблицу. Триггер работает нормально с одной записью, но когда я обновляю всю таблицу, например: update TBL_ADM_USER_GROUP set name = '123' регистрируется только одна запись в TBL_TestTable? почему только одна строка записана в TBL_TestTable и как включить этот триггер для регистрации всех обновленных строк?после триггера обновления для работы с несколькими строками

триггер:

CREATE TRIGGER [dbo].[Group_Update] 
ON [dbo].[TBL_ADM_USER_GROUP] 

AFTER UPDATE 
    AS 
    BEGIN 

    SET NOCOUNT ON; 

    DECLARE @userid INT 
    DECLARE @name nvarchar(1000) 

    SELECT @userid = i.changer_user_id from inserted i; 
    select @name = i.name from inserted i; 

    INSERT INTO TBL_TestTable 
    VALUES (CONCAT('Group "' ,@name,'" is updated'), 'GROUP', 'Update', SYSDATETIME(), @userid) 

END 

ответ

5

В SQL Server триггер работает в целом заявление, а не грести по строкам. Использование:

CREATE TRIGGER [dbo].[Group_Update] 
ON [dbo].[TBL_ADM_USER_GROUP] 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO TBL_TestTable -- define column list for clarity 
    SELECT CONCAT('Group "' ,i.name,'" is updated'), 
     'GROUP', 'Update', SYSDATETIME(), 
     i.changer_user_id 
    FROM inserted i; 
END 
+0

Как сделать идентификатор пользователя равным changer_user_id, как показано в вопросе? – Saif

+1

@Smart Вы не можете. '@ userid' является скалярной переменной и может содержать только одно значение в момент времени, поэтому, когда вы используете:' SELECT @userid = i.changer_user_id из вставленного i; 'вы получаете, вероятно, последнее значение из' вставленной' таблицы в зависимости от плана выполнения. – lad2025

+0

то, что вы сказали, абсолютно верно, но как использовать объявленные параметры userid и name? – Saif

Смежные вопросы