Встала задача производить аудит изменения данных в таблицах.
Было необходимо сохранить:
- Название таблицы
- Столбец
- Старое значение в таблице
- Новое значение в таблице
- Название столбца, являющего Primary Key
- Значение столбца, являющего Primary Key
- ID пользователя, внесшего изменения
Первое, что пришло в голову - это написать триггер, который бы
этим занимался.
Все оказалось не столь тривиально, как на первый взгляд.
Перво наперво задача была поделена на подзадачи.
- Как получить имя изменяемой таблицы.
- Как получить изменяемый столбец.
- Как получить старое значение.
- Как получить новой значение.
- Как узнать primary key этой таблицы.
- Как узнать значение primary key этой таблицы.
- Как передать ID пользователя.
Поспрашивав на форумах и почитав документацию ответы были найдены:
- Триггер создается на каждую таблицу, имя известно заранее.
- Воспользоваться update(), COLUMNS_UPDATED ( )
- Использовать таблицы inseted, updated
- Аналогично 3.
- SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
SELECT * FROM sys.objects WHERE type = 'pk' - Аналогично пункту 3
Остался открытым вопрос - как передать ID пользователя в триггер.
Можно использовать что-то вроде tmp view, но я в этом не уверен.
В обще - процесс написания запущен, посмотрим, что из этого выйдет.
Если кто-то что-то знает по этой теме и может помочь - милости просим в comments.