2016-12-12 7 views
0

I m new to Triggers. У меня есть таблица «Sample» и «SampleAudit». Я создал Trigger для обновления и вставки. Триггер выглядит следующим образом.Получить обновленное значение столбца и старое значение ON Update, вставить Trigger

CREATE TRIGGER [ss].[SampleTrigger] 
    ON [ss].[Sample] 
    FOR INSERT,UPDATE 

AS 
    declare @fullname varchar(200); 
    declare @addressline1 varchar(200); 
    declare @addressline2 varchar(200); 
    declare @landmark varchar(200); 
    declare @city bigint; 
    declare @state bigint; 
    declare @pin varchar(50); 
    declare @country varchar(100); 
    declare @auditaction varchar(100); 


    select @fullname=i.fullname from inserted i; 
    select @addressline1=i.addressline1 from inserted i; 
    select @addressline2=i.addressline2 from inserted i; 
    select @landmark=i.landmark from inserted i; 
    select @city=i.city from inserted i; 
    select @state=i.state from inserted i; 
    select @pin=i.pin from inserted i; 
    select @country=i.country from inserted i; 

    if UPDATE(@fullname) 
    set @auditaction= 'updated FullName from'+oldval+' to '+ new value ; 

    if UPDATE(@addressline1) 
    set @auditaction= 'updated addressline1 from'+oldval+' to '+ new value ; 

    if UPDATE(@addressline2) 
    set @auditaction= 'updated addressline2 from'+oldval+' to '+ new value ; 

    if UPDATE(@landmark) 
    set @auditaction= 'updated landmark from'+oldval+' to '+ new value ; 



insert into [ss].[SampleAudit] 
(FullName,AddressLine1,AddressLine2,LandMark,City,State,Pin,Country,auditaction) 
values(@fullname,@addressline1,@addressline2,@landmark,@city,@state,@pin,@country,@auditaction) 

Здесь каждый раз, когда обновление нового сырья вставляется в таблицу аудита. Таким образом,

if Update(fullname) 
    if UPDATE(@addressline1) 
    if UPDATE(@addressline2) 
    if UPDATE(@landmark) 

все обновляется. Итак, как я могу получить, какие и все поля обновляются? и старое и новое значение для всех обновленных полей.

1. I need to track which and all fields updated. 
2. and from which value to which value it is updated ? 
+0

'inserted' может содержать 0, 1 или несколько ** ** строк. Ваш триггер по своей сути нарушен - вам даже не гарантировано, что каждое из ваших отдельных назначений переменным будет извлекать значения из * той же строки *, и вы игнорируете все остальные строки. Попробуйте создать инструкцию 'insert ... select', которая ссылается на' insert' в предложении 'FROM'. –

+0

Я получу последние обновленные значения. триггер правильный. У меня нет проблем в триггере .... – RUPA

+0

Нет, если я пишу 'INSERT INTO Sample (полное имя) SELECT 'abc' UNION ALL 'def'', ваш триггер будет только поднимать * либо' 'abc', либо' def '. Не оба. Аналогично, для обновления, которое влияет на несколько строк, вы будете получать только значения из одной строки. 'вставленный' следует рассматривать как * таблицу *, которая может содержать несколько строк (или без строк). Триггеры запускаются один раз за оператор, а не один раз в строке. –

ответ

0
CREATE TRIGGER [ss].[SampleTrigger] 
    ON [ss].[Sample] 
    FOR INSERT,UPDATE 

AS 
    declare @fullname varchar(200); 
    declare @addressline1 varchar(200); 
    declare @addressline2 varchar(200); 
    declare @landmark varchar(200); 
    declare @city bigint; 
    declare @state bigint; 
    declare @pin varchar(50); 
    declare @country varchar(100); 
    declare @auditaction varchar(100); 


    select @fullname=i.fullname from inserted i; 
    select @addressline1=i.addressline1 from inserted i; 
    select @addressline2=i.addressline2 from inserted i; 
    select @landmark=i.landmark from inserted i; 
    select @city=i.city from inserted i; 
    select @state=i.state from inserted i; 
    select @pin=i.pin from inserted i; 
    select @country=i.country from inserted i; 

    Declare @Type int 
    IF EXISTS (SELECT * FROM inserted) and 
     EXISTS (SELECT * FROM deleted) 
       SELECT @Type = 'U' 
    Else 
     SELECT @Type = 'I' 

    if (@Type = 'U') 
    Begin 
     set @auditaction= 'updated FullName from'+ (Select d.fullname From deleted d) +' to '+ (Select i.fullname from inserted i) ; 
     insert into [ss].[SampleAudit] (FullName,AddressLine1,AddressLine2,LandMark,City,State,Pin,Country,auditaction) 
     values(@fullname,@addressline1,@addressline2,@landmark,@city,@state,@pin,@country,@auditaction) 

     set @auditaction= 'updated addressline1 from'+(Select d.addressline1 From deleted d)+' to '+ (Select i.addressline1 from inserted i) ; 
     insert into [ss].[SampleAudit] (FullName,AddressLine1,AddressLine2,LandMark,City,State,Pin,Country,auditaction) 
     values(@fullname,@addressline1,@addressline2,@landmark,@city,@state,@pin,@country,@auditaction) 

     set @auditaction= 'updated addressline1 from'+(Select d.addressline2 From deleted d)+' to '+ (Select i.addressline2 from inserted i) ; 
     insert into [ss].[SampleAudit] (FullName,AddressLine1,AddressLine2,LandMark,City,State,Pin,Country,auditaction) 
     values(@fullname,@addressline1,@addressline2,@landmark,@city,@state,@pin,@country,@auditaction) 

     set @auditaction= 'updated addressline1 from'+(Select d.landmark From deleted d)+' to '+ (Select i.landmark from inserted i) ; 
     insert into [ss].[SampleAudit] (FullName,AddressLine1,AddressLine2,LandMark,City,State,Pin,Country,auditaction) 
     values(@fullname,@addressline1,@addressline2,@landmark,@city,@state,@pin,@country,@auditaction) 
    End 

    If (@Type= 'I') 
    Begin 
     Set @auditaction = 'Insert' 
     insert into [ss].[SampleAudit] (FullName,AddressLine1,AddressLine2,LandMark,City,State,Pin,Country,auditaction) 
     values(@fullname,@addressline1,@addressline2,@landmark,@city,@state,@pin,@country,@auditaction) 
    End 
+0

У меня 23 колонки в моем столе. Тогда 23 строки будут вставлять, говоря, что полное имя обновлено от старого до нового значения и т. Д. – RUPA

+0

Сделав это, я получу старые и новые значения, но если я не буду обновлять все поля, кроме полного имени, 4 строки будут вставляться в аудиторская таблица. – RUPA

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