Привет всем! Недавно на работе встала задача повесить лог на несколько таблиц из базы под MSSQL2000. Хотелось разработать универсальный код для всех таблиц, т.е. использовать 1 таблицу для лога. Плюсы такого лога: не нужно каждый раз модифицировать триггер при добавлении новых полей в таблицу, и тем более при их переименовании. Формат лога примерно такой: username, tablename, change_type, fieldname, oldvalue, newvalue.
Главная проблема — это извлечение значения из таблицы по названию поля. Так как я не нашел подходящей конструкции, пришлось извращаться примерно таким образом
...
create table #t(f1 sql_variant)
@sql = 'select top 1 ' + FieldName + ' from ' + TableName
insert into t exec @sql
drop table #t
...
В цикле по всем полям определяется разница значений между таблицами inserted и deleted.
Ради универсальности пришлось вынести весь код в хранимую процедуру.
Правда перед этим копировать таблицы inserted и deleted во временные, а после удалять.
В итоге все уперлось в производительность и еще один непонятный глюк.
Когда в таблице мало полей и значений, все нормально. При попытке навесить такой лог на таблицу Сотрудник с 250 полями, в которой была только 1 запись, Enterprise Manager задумался на секунд так на 5, но отработал правильно, ура. Если же попытаться изменить любое поле в окне return all rows, когда в таблице около 7000 записей, система впадает в даун, вываливает сообщение о приблизительном количестве каких-то записей. В итоге все это закончилось сообщением о нехватке виртуальной памяти и последующей перезагрузкой.
Корыто под MSSQL2000 — 4 х Xeon 2800 + 6gb Ram + 6x36Gb Cheetah.
Есть ли какие соображения по поводу оптимизации такого кода?
Здравствуйте, hydralisk, Вы писали:
[skip]
H>Есть ли какие соображения по поводу оптимизации такого кода?
Имхо, проще отказаться от идеи общего кода для всех таблиц и написать генератор кода, создающий нужные триггера по описанию таблиц в INFORMATION_SCHEMA. Работы на полдня.
silent
Здравствуйте, lazymf, Вы писали:
L>Имхо, проще отказаться от идеи общего кода для всех таблиц и написать генератор кода, создающий нужные триггера по описанию таблиц в INFORMATION_SCHEMA. Работы на полдня.
Вот, имхо, неплохой тул для создания шаблонов
CodeSmith.
Здравствуйте, hydralisk, Вы писали:
H>Привет всем! Недавно на работе встала задача повесить лог на несколько таблиц из базы под MSSQL2000.
ктож этим не занимался
Ещё NULL надо правильно обрабатывать и очень желательно уникальные ключи у таблиц иметь а ещё лучше тогда требовать наличия
[id] int IDENTITY .
H>Есть ли какие соображения по поводу оптимизации такого кода?
'В цикле по всем полям определяется разница значений между таблицами inserted и deleted.'
а назачем это ??? Есть же такое дело, как COLUMNS_UPDATED например.
... << RSDN@Home 1.1.0 stable >>