2014-09-23 11 views
0

У меня есть таблица tab, и я хочу создать таблицу History, чтобы вставить обновления, которые я сделал в таблице tab. Для этого я создал триггер tr_update, но он не работает правильно.таблица добавляет обновления sql server

Create table Tab 
(
id_tab char(5), 
data_tab int 
) 

Create table History 
(id_modify  char(3), 
old_data    int, 
new_data    int, 
) 


Create trigger tr_update 
on tab 
after update 
as 
declare @id char(3) 
declare @old int 
declare @new int 

select @id=id_tab, @new=data_tab from inserted 
select @old=data_tab from deleted 

insert into History (id_modify,old_data,new_data) 
values (@id,@old,@new) 
+0

Как написано, [ваш триггер обречен на провал] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-abusing-triggers.aspx). Кроме того, вы можете уточнить, что означает «он не работает правильно». –

ответ

0

Триггеры работы с наборами данных, а это означает, что множества inserted и deleted может содержать более одной строки, и что простые задания не будут работать. Вместо этого вы можете использовать inserted и deleted в качестве исходных таблиц (и присоединяться к ним, если вам нужны как новые, так и старые данные, как в этом случае).

Create trigger tr_update 
on tab 
after update 
as 

insert into History (id_modify,old_data,new_data) 
select i.id_tab, d.data_tab, i.data_tab 
from inserted i 
inner join deleted d on i.id_tab = d.id_tab 

На стороне записки, это кажется id_data поданного в таблице истории только 3 символов в ширине, в то время как исходная таблица имеет как ширину 5 символов. Вероятно, это не сработает; поле в таблице истории должно быть того же размера (или более широкого), иначе сервер не разрешит вставку, поскольку данные могут быть усечены.

+0

спасибо! –

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