универсальный лог на MSSQL
От: hydralisk  
Дата: 18.02.04 17:18
Оценка:
Привет всем! Недавно на работе встала задача повесить лог на несколько таблиц из базы под 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.
Есть ли какие соображения по поводу оптимизации такого кода?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.