Как выполнять триггер один раз после update есть в нем есть update тоже?

Всем доброго дня!
Помогите, пожалуйста, разобраться с триггером ms sql. Триггер на update таблицы.
Таблица содержит некое поле Status_id, в нее поступают данные и в момент записи Status_id = 2, мне нужно чтобы он был изменен на 3 и при этом была отработана процедура.
В результате получается, что если триггер срабатывает 2 раза (логично - момент записи-обновления дынных (через update) и после update прописанного в нем, но как мне казалось во время второго выполнения Status_id должен быть равен 3. Но судя по тому, что процедура все равно отрабатывает второй раз - он равен 2, хотя по запросу к таблице он будет уже 3, т.к. update status_id уже отработал.
Ниже полный код триггера с комментариями:
CREATE TRIGGER [Upeco Чек-Лист].CreateTask
ON [Upeco Чек-Лист].[ProjectForms_600]
AFTER UPDATE 
AS 
begin
	declare @Id int, @Pid int, @UserId int, @DateCreate datetime,
		@C1 int, @C2 int=0, @TaskName nvarchar(max), @TaskSubject nvarchar(max),
		@UserUn uniqueidentifier, @DateEnd datetime, @DateBegin datetime, @Img nvarchar(max),
		@Status_Id int, @Del int
	select @Id=Id, @Pid=[BaseItem_id], @UserId=[Merchandiser_Id], @DateCreate=ISNULL(DateUpdated,DateCreated), @Status_Id=[Status_Id], @Del=isnull([Deleted],0) 
	from inserted
--ниже предположил, что inserted после update для status_id содержит 2 записи и по этому условие на выборку максимальной
	where [Status_Id]=(select max([Status_Id]) from inserted)
	select @UserUn = [UserId] from [dbo].[aspnet_UsersData] WITH (NOLOCK) where Id = @UserId

--условие для срабатывания запросов ниже:
	IF @Del=0 and @Status_Id=2
	begin

		select @Img = coalesce(@Img, '<br />') + '<img style="width:400px;" alt="" src="..\..\' + [FileName] + '" /><br /><br />' 
		from [Application].[FormFieldsDataContent] 
		where [FormId]=@Id and [FormFieldsDataId]=1388

		IF len(@Img)>15
		begin
			set @DateBegin = GETDATE() + 1
			set @DateEnd = GETDATE() + 4
			select	@TaskName = ISNULL(Poi.Сеть,'') + ', ' + ISNULL(Poi.Область,'') + ', ' + ISNULL(Poi.Город,'') + ', ' + ISNULL(Poi.Адрес,''),
					@TaskSubject = coalesce(@TaskSubject + '<br/><br/>', '') + 'Бренд: ' + ISNULL(B.Наименование,'') + ' <br/> Проблема: ' + ISNULL(P.[Описание проблемы],'') +  ' <br/> Задача: ' + ISNULL(Z.[Описание проблемы],'')
			from [Upeco Чек-Лист].[Список задач на следующий визит_605] Z inner join
				[Upeco Чек-Лист].ProjectForms_600 PF on Z.Form_id=PF.Id inner join
				GlobalList.Адреска_593 Poi on PF.BaseItem_id=Poi.Id inner join
				GlobalList.[Список проблем_603] P on Z.Задача=P.Id left outer join
				GlobalList.Бренды_629 B on Z.Бренд=B.Id
			where Z.Form_id=@Id
			IF len(@TaskSubject)>0
			begin
				set @TaskSubject = '<p>' + @TaskSubject + '</p>' + @Img
				exec [Application].[ProjectTasksAdd] 
						@ProjectId=63, 
						@TaskName=@TaskName,
						@UserCreate=@UserUn, 
						@TaskSubject=@TaskSubject, 
						@DateBegin=@DateBegin, 
						@DateEnd=@DateEnd,
						@Points=@Pid
			end

			
		end
--Обновляем Status_id на 3
		update [Upeco Чек-Лист].[ProjectForms_600] set [Status_Id]=3, DateUpdated=GETDATE() where id=@Id
	end

end
  • Вопрос задан
  • 610 просмотров
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Например так:
CREATE TRIGGER PublicationAlbumUpdate ON [Album] FOR UPDATE AS 
BEGIN
  SET NOCOUNT ON
  IF NOT (UPDATE ( Publication ) OR UPDATE ( Added )) BEGIN
    UPDATE Album SET Publication = GETDATE() 
      FROM Album INNER JOIN inserted ON Album.ID = inserted.ID
    UPDATE Album SET Publication = GETDATE() 
      FROM Album INNER JOIN inserted ON Album.ID = inserted.EditMaster
  END
--
END
--
GO
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы