2014-01-07 4 views
0

Я пытаюсь написать триггер для вставки, обновление кода нижекак написать триггер для вставки, обновления

ALTER TRIGGER [dbo].[tg_tbl_demographic_details_purple] 
ON [dbo].[tbl_demographic_details] 
FOR INSERT,update 

AS 
BEGIN 

declare @purple_sc varchar(10),@id varchar(10),@name varchar(30) 

set @purple_sc= (select Purple from tbl_demographic_details where [email protected]@IDENTITY) 

if update(Purple)--purle is column name if this column is update below if loop executed 
begin 
    if (@purple_sc > 105) 
    begin 

     set @id= (select ID from tbl_demographic_details where [email protected]@IDENTITY) 
     set @name= (select name from tbl_demographic_details where [email protected]@IDENTITY) 

     update tbl_list_purple_flag set [email protected]_sc,[email protected],[email protected] where date = CONVERT(VARCHAR(8), SYSDATETIME(), 10) 
    end 
end 

if (@purple_sc > 105) 
begin 
    set @id= (select ID from tbl_demographic_details where [email protected]@IDENTITY) 
    set @name= (select name from tbl_demographic_details where [email protected]@IDENTITY) 

    insert into tbl_list_purple_flag (Score,Id,Name,Date) values(@purple_sc,@id,@name,CONVERT(VARCHAR(8), SYSDATETIME(), 10)) 
end 

END 

Проблема заключается в его вставке в два раза, как показано ниже

Sno Id  Name Score Date  
24 0107140000 sd 111 01-07-14  
25 NULL  NULL 111 01-07-14 

Что случилось с этим?

ответ

1

Изменить FOR INSERT,update на instead of insert, update и он должен работать нормально.

Ваш триггер происходит после Вставка/обновление завершено, вместо запуска триггер не позволяет вставить/обновить вообще.

Возможно, вам придется отделить два триггера (то есть один для instead of insert, а другой - до instead of update), чтобы сделать эту работу, просто попробуйте.

Если это не сработает, вы должны указать, какой SQL-сервер вы используете. Я предполагаю MS SQL, где это должно работать.

Также не следует использовать @@IDENTITY. Он содержит последнее вставленное значение идентификатора, которое может быть ожидаемым вами значением, или нет. Вместо этого вы должны использовать таблицу inserted, которую вы получаете в триггере, который содержит все вставленные/обновленные строки, которые вызвали запуск триггера.

Например, если вы сделали обновление более чем одной строки сразу, то @@IDENTITY будет только последним изменяться, и вы не будете делать ничего по сравнению с предыдущими.

Кроме того, кажется, что вы создаете совершенно ненужное количество триггеров - уверены ли вы, что они достаточно разные, что это хорошее решение?

+0

спасибо, я попытаюсь изменить концепцию – Happy

+1

Для триггера обновления '@@ IDENTITY' будет хуже, чем бесполезно -' UPDATE' не влияет на него. Но ваша точка по-прежнему актуальна для многострочных вставок. –

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