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

Откуда:
Сообщений: 34
Здравствуйте !!!!
Помогите с идеей массового апдейта для таблицы, что бы я мог логировать эти изменения в другую(логирующую таблицу)
Есть таблица назовём её table( в ней есть поле IDENTITY назовём его id)
и есть таблица log_table
Таблица log_table имеет все те же столбцы что у table + дополнительные (дополнительное поле - version :версия изменение )
и в таблице log_table сделал Primary Key На два поля id+version

При изменении какой то записи в таблице table - эта запись (уже новая) заноситься в таблицу log_table (в таблице так же имееться поле log_id -- поле IDENTITY )
при чем таким образом

declare @id int =	(select id from inserted)

INSERT INTO log_table(
id
,version)
select
id
,(select isnull(MAX(version),-1)+1 from [log_table] where id=@id)
from table 
where id=@id


Так вот всё работало) точней для сайте)
пока не пришлось мне обновить пару записей в табице table
Проблема в том что мне нужно хранить версию изменения для даного id -
и я не знаю как это сделать .....
Возможно есть идеи ?

Сообщение было отредактировано: 18 июл 12, 12:28
18 июл 12, 12:23    [12882719]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
Glory
Member

Откуда:
Сообщений: 104751
В log_table поле id должно быть id из table, а поле version должно быть IDENTITY
18 июл 12, 12:44    [12882836]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
Nelly_lucky
Member

Откуда:
Сообщений: 34
Возможно я не правильно объяснил
в таблице table
находяться записи с уникальным полем id (поле IDENTITY)
в таблицы log_table так же есть поле IDENTITY с названием log_id - но пока это поле не несёт никакой нагрузки,
я же хочу сделать запись в таблице log_table уникальной по двум полям id(это копия поля id ) и version
то есть для даной записи (из таблицы table) - вести количество изменений (так званных версий модификации записи )
18 июл 12, 13:43    [12883181]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
Glory
Member

Откуда:
Сообщений: 104751
Nelly_lucky
в таблицы log_table так же есть поле IDENTITY с названием log_id - но пока это поле не несёт никакой нагрузки,

Вот именно, что не несет
Nelly_lucky
я же хочу сделать запись в таблице log_table уникальной по двум полям id(это копия поля id ) и version

Я именно это вам и предлагал. Только version будет IDENTITY вместо log_id.
18 июл 12, 14:34    [12883494]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
Nelly_lucky
Member

Откуда:
Сообщений: 34
ок
Как я себе думал это сделать
допустим таблица table( id, name, country, city) у нас пустая
и мы решили добавить туда запись:
insert into table(name, country, city) values( 'kola', 'Ukraine' , 'Kiev')
потом ещё одну
insert into table(name, country, city) values( 'Vasa' , 'Gryzia' , ' Alabama')

Срабатывает тригер insert который заносит эти данные в таблицу log_table. И мы получаем такие данные
select * from log_table
log_id id name country city version
1 1 kola Ukraine Kiev 0
2 2 Vasa Gryzia Alabama 0

Если проапдейтить :
update table set name='IGOR' where id=1
update table set name='Igor' where id=1
update table set name='Игорь' where id=1
update table set name='Вася' where id=2

то сработает тригер апдейта

select * from log_table

log_id id name country city version
1 1 kola Ukraine Kiev 0
2 2 Vasa Gryzia Alabama 0
3 1 IGOR Ukraine Kiev 1
4 1 Igor Ukraine Kiev 2
5 1 Игорь Ukraine Kiev 3
6 2 Вася Gryzia Alabama 1
То есть я думал делать версии для даного id
Если делать так как вы говорите то оно тоже будет работать, но дело в том что функционал уже написан и он на живом сервере .....
можно ли в моём случае сделать масовый апдейт ?
18 июл 12, 16:02    [12884205]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
Nelly_lucky,

Видимо, что-то такое

INSERT INTO log_table(
  id
, version)
select i.id
       , isnull( max( lt.version ), -1 ) + 1 
from inserted i
  left outer join log_table lt on i.id = lt.id
group by i.id


и триггер сделать один: на вствку и на обновление
18 июл 12, 19:28    [12885393]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
Nelly_lucky
Member

Откуда:
Сообщений: 34
Падает с ошибкой
Msg 512, Level 16, State 1, Procedure ******, Line 53
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
Warning: Null value is eliminated by an aggregate or other SET operation.
20 июл 12, 17:35    [12894584]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
Nelly_lucky,
Это что так падает? В моем триггере нет подзапросов.
20 июл 12, 22:27    [12895414]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
Видать, объявление @id осталось
20 июл 12, 22:29    [12895418]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
Nelly_lucky
Member

Откуда:
Сообщений: 34
вот примерный код

INSERT INTO table(

/** тут полей 50**/
,version

)

select
(
/** 50 полей**/
,(select isnull(max(log_table.version ), -1 ) + 1 from inserted
left join log_table on inserted.id = log_table.id group by inserted.id)


)

FROM [table]
where id in (select id from inserted)


Скорей всего Glory был прав и нужно переделать version под identity поле и сортировать по этому полю выставляя версии на лету
23 июл 12, 11:41    [12901255]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Система отслеживания измененных данных
23 июл 12, 15:13    [12903073]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с тригером на апдейт  [new]
Nelly_lucky
Member

Откуда:
Сообщений: 34
спасибо, я читал это когда то, правда не помню по каким причинам но такая реализация нам не подошла.....
сейчас все действия которые пользователь делает должно выводиться для админа(что бы он это видел) поэтому и было выбрано логировать действия средствами тригеров и и дополнительных таблиц
23 июл 12, 15:52    [12903467]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить