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 ?
'inserted' может содержать 0, 1 или несколько ** ** строк. Ваш триггер по своей сути нарушен - вам даже не гарантировано, что каждое из ваших отдельных назначений переменным будет извлекать значения из * той же строки *, и вы игнорируете все остальные строки. Попробуйте создать инструкцию 'insert ... select', которая ссылается на' insert' в предложении 'FROM'. –
Я получу последние обновленные значения. триггер правильный. У меня нет проблем в триггере .... – RUPA
Нет, если я пишу 'INSERT INTO Sample (полное имя) SELECT 'abc' UNION ALL 'def'', ваш триггер будет только поднимать * либо' 'abc', либо' def '. Не оба. Аналогично, для обновления, которое влияет на несколько строк, вы будете получать только значения из одной строки. 'вставленный' следует рассматривать как * таблицу *, которая может содержать несколько строк (или без строк). Триггеры запускаются один раз за оператор, а не один раз в строке. –