Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Обновить поле в триггере  [new]
sraider
Member

Откуда:
Сообщений: 325
Есть таблица, содержащая текстовое поле Number. И процедура, которая после любых обновлений таблицы пересчитывает некоторые данные. Вызывается в триггере.
Create Table T
(
	[id] uniqueidentifier Not Null,
	[Number] nvarchar(max) Null,
	-- ... и другие поля
)
GO

Create Procedure P As
-- что-то считает, используя все строки и поля таблицы, в том числе поле [Number],
-- записывает результаты в другую таблицу
Print 'Hello World'
GO

Create Trigger TR on T After Insert, Update, Delete As
Exec P
GO


При расчетах значение поля [Number] "нормализуется" - удаляются пробелы, табуляции, знаки пунктуации и т.п. Например, так:
Replace(Replace(Replace(Replace([Number], ' ', ''), '-', ''), '.', ''), '/', '')


Для повышения производительности хочется в процедуре каждый раз не нормализовывать каждый номер, а кэшировать нормализованный номер. Создать в таблице поле [Norm Number], куда сохранять результат нормализации, и в процедуре использовать это поле вместо [Number]:
Alter Table T Add
[Norm Number] nvarchar(max) Null
GO

Alter Trigger TR on T After Insert, Update, Delete As
If Update([Number])
Update T
Set [Norm Number] = Replace(Replace(Replace(Replace([Number], ' ', ''), '-', ''), '.', ''), '/', '')
Where [id] In (Select [id] From Inserted)

Exec P
GO

Только в таком случае в триггере получается обновление этой же таблицы, и триггер вызывается рекурсивно еще раз (т.к. у базы стоит Recursive Triggers Enabled - нужно для других триггеров):
Insert T ([id], [Number]) Values (NewID(), '1-2-3')

Hello World

(1 row(s) affected)
Hello World

(1 row(s) affected)


Нужно чтобы при обновлении таблицы процедура вызывалась только один раз. И чтобы одинаково работало на всех версиях от SQL Server 2005 и выше.
29 ноя 14, 13:11    [16923813]     Ответить | Цитировать Сообщить модератору
 Re: Обновить поле в триггере  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
create trigger ...
as
begin
 if trigger_nestlevel(@@procid) > 1
  return;

 ...

end;
29 ноя 14, 13:41    [16923897]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить