Журналирование изменений БД с помощью тригеров

zvezda_t
Дата: 02.06.2011 20:57:54
Здравствуйте, уважаемые программисты!

Подскажите мне пожалуйста, как правильно делают журнализацию с помощью тригеров?
Если можно небольшой примерчик)

Заранее, огромное спасибо!!!
zvezda_t
Дата: 02.06.2011 21:06:19
Есть таблицы, которые изменяют пользователи.

Мне нужно в таблице journal, фиксировать дату изменения, кем вносилось изменение, значение до изменения и значение после изменения.

journal
date_change id_user old_value new_value
Гавриленко Сергей Алексеевич
Дата: 02.06.2011 21:10:19
Ищите посиком, обсуждалось. Даже статься есть на эту тему.
zvezda_t
Дата: 02.06.2011 21:22:06
В полях old_value и new_value
Я хочу сохранить значения изменяемой записи в виде:
"имя_поля1: значение1, имя_поля2: значение2, имя_поля3: значение3"

Например таблица
student
lastnamenamebirthdayfaculty


В MS SQL при создании поля таблицы можно заполнить описание поля. А как получить это значение в запросе? Например чтобы записать туда названия полей по русски, а потом использовать для формирования записи (old_value и new_value) таблицы journal.
Чтобы в итоге получить:

date_change id_user old_value new_value
03.06.20111Фамилия:Иванов Имя:Иван Дата Рождения:23.03.82 Факультет:Исторический Фамилия:Петров Имя:Сергей Дата Рождения:13.03.8й Факультет:Физический
iap
Дата: 02.06.2011 21:28:59
Журналирование изменений структуры БД и данных

Не понимаю, зачем хранить "значение после изменения", если оно и так хранится в самой таблице?
zvezda_t
Дата: 02.06.2011 21:41:17
iap,

потому что может быть несколько последовательных изменений от разных пользователей, и необходима история, о том кто и что менял.
pkarklin
Дата: 02.06.2011 21:43:35
zvezda_t,

автор
Я хочу сохранить значения изменяемой записи в виде:
"имя_поля1: значение1, имя_поля2: значение2, имя_поля3: значение3"



Лучше не надо, ибо не взлетит. Уже все украдено до Вас придумано за Вас:

Change Data Capture
zvezda_t
Дата: 03.06.2011 07:27:30
pkarklin, спасибо за ссылку!
А у меня MS SQL 2005. там такая Система Отслеживания Изменения Данных есть?
И как ей пользоваться? Как то не понятно...
pkarklin
Дата: 03.06.2011 08:11:40
zvezda_t,

В 2005 нет.
zvezda_t
Дата: 03.06.2011 14:43:43
Вот такой триггер у меня получился.
Только я не знаю как можно перечислить поля таблицы, не обращаясь к ним по имени.
Не очень рационально, для каждого поля функцию вызывать.
Научите пожалуйста, как правильно сделать?

ALTER TRIGGER [dbo].[trg_student_u] 
   ON  [dbo].[student]
   AFTER UPDATE
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
		
	INSERT INTO dbo.history_jurnal 
    (id_user,id_action,date_action,description_action)
     SELECT user_change,1,GetDate(),
    (SELECT 'Изменение данных <Студента>
Старые значения:
    '+convert(varchar, property1.value) + ': ' + del.lastname +'
    '+convert(varchar, property2.value) + ': ' + del.name+ '
Новые значения:
    '+convert(varchar, property1.value) + ': ' + ins.lastname +' 
    '+convert(varchar, property2.value) + ': ' + ins.name
	FROM 
	fn_listextendedproperty (NULL, 'schema', 'dbo', 'table', 'student', 'column', 'lastname') as property1,
	fn_listextendedproperty (NULL, 'schema', 'dbo', 'table', 'student', 'column', 'name') as property2,
	inserted as ins, deleted as del),    
    FROM INSERTED
	
END