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

Откуда:
Сообщений: 20460
Добрый вечер!
Хочу написать триггер, который будет писать в лог
историю изменений некой таблицы свободной структуры.
Такое возможно?

Насколько помню, в функцию UPDATE передаётся фиксированнное имя поля.
Есть ещё функция COLUMNS_UPDATED(), но там по битам разбирать нужно.
Есть ли смысл браться?
1 ноя 19, 21:07    [22008493]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
iap
Member

Откуда: Москва
Сообщений: 46887
defragmentator
Добрый вечер!
Хочу написать триггер, который будет писать в лог
историю изменений некой таблицы свободной структуры.
Такое возможно?

Насколько помню, в функцию UPDATE передаётся фиксированнное имя поля.
Есть ещё функция COLUMNS_UPDATED(), но там по битам разбирать нужно.
Есть ли смысл браться?
Забудьте о UPDATE() и COLUMNS_UPDATED().
Они работают совсем не так, как вы думаете.
1 ноя 19, 21:51    [22008514]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 431
Почему не https://docs.microsoft.com/ru-ru/sql/relational-databases/tables/temporal-tables?view=sql-server-2017 ?
2 ноя 19, 00:46    [22008550]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
defragmentator
Member

Откуда:
Сообщений: 20460
Андрей Юниор
Почему не https://docs.microsoft.com/ru-ru/sql/relational-databases/tables/temporal-tables?view=sql-server-2017 ?


Это, конечно, интересно, только чем inserted.* и deleted.* хуже ?

Сообщение было отредактировано: 2 ноя 19, 06:31
2 ноя 19, 06:31    [22008587]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 431
defragmentator
Это, конечно, интересно, только чем inserted.* и deleted.* хуже ?

Отсутствием необходимости вручную делать логи и синтаксисом запросов: появляется возможность использоваться FOR SYSTEM_TIME.

Но вместе с тем будет вагон и маленькая тележка ограничений, но это другой вопрос Картинка с другого сайта.
2 ноя 19, 09:16    [22008603]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29549
Андрей Юниор
defragmentator
Это, конечно, интересно, только чем inserted.* и deleted.* хуже ?

Отсутствием необходимости вручную делать логи и синтаксисом запросов: появляется возможность использоваться FOR SYSTEM_TIME.

Но вместе с тем будет вагон и маленькая тележка ограничений, но это другой вопрос Картинка с другого сайта.
Таблицу (которую нужно логировать) всё равно приходится делать. Соответственно, не вижу проблем сделать и таблицу логов.

Использовать temporal tables для логирования ИМХО слишком избыточно.
Вместо хранения логов в отдельной таблице логов, они будут лежать в той же рабочей таблице. Зачем, если логи нужны раз в год, для разработчика или администратора?
2 ноя 19, 09:29    [22008606]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
msLex
Member

Откуда:
Сообщений: 6959
alexeyvg
Андрей Юниор
пропущено...

Отсутствием необходимости вручную делать логи и синтаксисом запросов: появляется возможность использоваться FOR SYSTEM_TIME.

Но вместе с тем будет вагон и маленькая тележка ограничений, но это другой вопрос Картинка с другого сайта.
Таблицу (которую нужно логировать) всё равно приходится делать. Соответственно, не вижу проблем сделать и таблицу логов.

Использовать temporal tables для логирования ИМХО слишком избыточно.
Вместо хранения логов в отдельной таблице логов, они будут лежать в той же рабочей таблице. Зачем, если логи нужны раз в год, для разработчика или администратора?


Вообще, таблица версий в темпорал тейблс - это отдельная таблица. Её вообще можно создать вручную, в своей файловой группе и со своим набором индексов.
2 ноя 19, 10:39    [22008617]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
court
Member

Откуда:
Сообщений: 1831
defragmentator
Хочу написать триггер, который будет писать в лог
историю изменений некой таблицы свободной структуры.

"таблицы свободной структуры" означает, что по понедельникам, - в неё будут добавлять поля, а по пятницам - дропать ? :))
Есть такая партия такой триггер ! :)

create table dbo.T (id int identity primary key, f1 int, f2 float, f3 varchar(20))
go

insert into dbo.T (f1, f2, f3) values
(1, 1/2.0, 'one'),(2, 2/3.0, 'two'),(3, 3/4.0, 'three') 
go

create trigger dbo.uT 
on dbo.T
for update
as
begin
	declare @d xml, @i xml
	--
	set @d = (select * from deleted  for xml raw, elements xsinil)
	set @i = (select * from inserted for xml raw, elements xsinil)
	--
	-- insert into dbo.T_log (id, field_name, old_value)
	select 
		t.c.value('(../id/text())[1]', 'int') as id 
		,t.c.value('local-name(.)', 'varchar(255)') as field_name
		,t.c.value('./text()[1]', 'varchar(max)') as old_value
	from @d.nodes('/row/*') as t(c) 

	except

	select 
		t.c.value('(../id/text())[1]', 'int') as id 
		,t.c.value('local-name(.)', 'varchar(255)')
		,t.c.value('./text()[1]', 'varchar(max)')
	from @i.nodes('/row/*') as t(c)
end
go

update dbo.T
set f1 = 100, f2 = f2 / f1, f3 = f3 + '!'
where id > 1
go

select * from dbo.T
go

alter table dbo.T add f4 int
go

update dbo.T
set f4 = f1
go

select * from dbo.T
go

drop trigger dbo.uT 
go

drop table dbo.T
go

+

(затронуто строк: 3)
id field_name old_value
----------- -------------------- --------------------
2 f1 2
2 f2 6.666660000000000e-0
2 f3 two
3 f1 3
3 f2 7.500000000000000e-0
3 f3 three

(затронуто строк: 6)

(затронуто строк: 2)

id f1 f2 f3
----------- ----------- ---------------------- --------------------
1 1 0,5 one
2 100 0,333333 two!
3 100 0,25 three!

(затронуто строк: 3)

id field_name old_value
----------- -------------------- --------------------
1 f4 NULL
2 f4 NULL
3 f4 NULL

(затронуто строк: 3)

(затронуто строк: 3)

id f1 f2 f3 f4
----------- ----------- ---------------------- -------------------- -----------
1 1 0,5 one 1
2 100 0,333333 two! 100
3 100 0,25 three! 100

(затронуто строк: 3)

2 ноя 19, 10:56    [22008627]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29549
msLex
alexeyvg
Вместо хранения логов в отдельной таблице логов, они будут лежать в той же рабочей таблице. Зачем, если логи нужны раз в год, для разработчика или администратора?

Вообще, таблица версий в темпорал тейблс - это отдельная таблица. Её вообще можно создать вручную, в своей файловой группе и со своим набором индексов.
Ой, действительно, ошибся...
2 ноя 19, 11:07    [22008633]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
defragmentator
Member

Откуда:
Сообщений: 20460
court,

Да, вроде б ничего.
Но это надо быть спецом по обработке XML, а я только простейшие примеры знаю.

Короче, появилась мысль вытащить курсором список полей в таблице и через
EXECUTE по одному сравнивать их старое и новое значение.
2 ноя 19, 21:03    [22008824]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29549
defragmentator
Да, вроде б ничего.
Но это надо быть спецом по обработке XML, а я только простейшие примеры знаю.
Так вам court дал готовый код универсального триггера, даже разбираться не надо.

Тем более, что работу с XML в сиквеле всё равно полезно будет освоить.
2 ноя 19, 21:13    [22008829]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
defragmentator
Member

Откуда:
Сообщений: 20460
alexeyvg
готовый код универсального триггера, даже разбираться не надо.


не тождественно

alexeyvg
всё равно полезно будет освоить.



Сорри за подковырку.
2 ноя 19, 23:45    [22008886]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29549
defragmentator
alexeyvg
готовый код универсального триггера, даже разбираться не надо.

не тождественно
alexeyvg
всё равно полезно будет освоить.

Сорри за подковырку.
Ну, вы можете просто вставить, с минимальными усилиями, по методологии разработки "паст-копи из интернета".

А можете и поразбираться, если захотите.
3 ноя 19, 00:22    [22008902]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3149
defragmentator
Добрый вечер!
Хочу написать триггер, который будет писать в лог
историю изменений некой таблицы свободной структуры.
Такое возможно?

Насколько помню, в функцию UPDATE передаётся фиксированнное имя поля.
Есть ещё функция COLUMNS_UPDATED(), но там по битам разбирать нужно.
Есть ли смысл браться?


таблица "свободной структуры"? девушка "свободной профессии".
вы собрались логгировать изменение структуры таблицы или данных?
4 ноя 19, 10:49    [22009250]     Ответить | Цитировать Сообщить модератору
 Re: Запись истории изменнеий в лог  [new]
iap
Member

Откуда: Москва
Сообщений: 46887
iap
defragmentator
Добрый вечер!
Хочу написать триггер, который будет писать в лог
историю изменений некой таблицы свободной структуры.
Такое возможно?

Насколько помню, в функцию UPDATE передаётся фиксированнное имя поля.
Есть ещё функция COLUMNS_UPDATED(), но там по битам разбирать нужно.
Есть ли смысл браться?
Забудьте о UPDATE() и COLUMNS_UPDATED().
Они работают совсем не так, как вы думаете.
UPDATE() возвращает TRUE, если указанное поле есть в списке SET команды UPDATE, вызвавшей данный триггер,
независимо от изменения значения поля. Тем более, что строк в inserted/deleted может быть много,
а измениться могут не все. Кроме того, триггер запускается и в отсутствие каких-либо изменений.
То же самое касается и функции COLUMNS_UPDATED().

Можно ещё ознакомиться со статьёй Журналирование изменений структуры БД и данных
Правда, она написана, когда только вышел SQL2005. Но всё равно полезно.
4 ноя 19, 15:04    [22009387]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить