Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запись истории изменнеий в лог / 15 сообщений из 15, страница 1 из 1
01.11.2019, 21:07
    #39884512
defragmentator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
Добрый вечер!
Хочу написать триггер, который будет писать в лог
историю изменений некой таблицы свободной структуры.
Такое возможно?

Насколько помню, в функцию UPDATE передаётся фиксированнное имя поля.
Есть ещё функция COLUMNS_UPDATED(), но там по битам разбирать нужно.
Есть ли смысл браться?
...
Рейтинг: 0 / 0
01.11.2019, 21:51
    #39884526
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
defragmentatorДобрый вечер!
Хочу написать триггер, который будет писать в лог
историю изменений некой таблицы свободной структуры.
Такое возможно?

Насколько помню, в функцию UPDATE передаётся фиксированнное имя поля.
Есть ещё функция COLUMNS_UPDATED(), но там по битам разбирать нужно.
Есть ли смысл браться?Забудьте о UPDATE() и COLUMNS_UPDATED().
Они работают совсем не так, как вы думаете.
...
Рейтинг: 0 / 0
02.11.2019, 00:46
    #39884545
Андрей Юниор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
...
Рейтинг: 0 / 0
02.11.2019, 06:31
    #39884556
defragmentator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
Андрей ЮниорПочему не https://docs.microsoft.com/ru-ru/sql/relational-databases/tables/temporal-tables?view=sql-server-2017 ?

Это, конечно, интересно, только чем inserted.* и deleted.* хуже ?
...
Рейтинг: 0 / 0
02.11.2019, 09:16
    #39884564
Андрей Юниор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
defragmentatorЭто, конечно, интересно, только чем inserted.* и deleted.* хуже ?
Отсутствием необходимости вручную делать логи и синтаксисом запросов: появляется возможность использоваться FOR SYSTEM_TIME.

Но вместе с тем будет вагон и маленькая тележка ограничений, но это другой вопрос
...
Рейтинг: 0 / 0
02.11.2019, 09:29
    #39884566
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
Андрей ЮниорdefragmentatorЭто, конечно, интересно, только чем inserted.* и deleted.* хуже ?
Отсутствием необходимости вручную делать логи и синтаксисом запросов: появляется возможность использоваться FOR SYSTEM_TIME.

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

Использовать temporal tables для логирования ИМХО слишком избыточно.
Вместо хранения логов в отдельной таблице логов, они будут лежать в той же рабочей таблице. Зачем, если логи нужны раз в год, для разработчика или администратора?
...
Рейтинг: 0 / 0
02.11.2019, 10:39
    #39884574
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
alexeyvgАндрей Юниорпропущено...

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

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

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

Вообще, таблица версий в темпорал тейблс - это отдельная таблица. Её вообще можно создать вручную, в своей файловой группе и со своим набором индексов.
...
Рейтинг: 0 / 0
02.11.2019, 10:56
    #39884576
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
defragmentatorХочу написать триггер, который будет писать в лог
историю изменений некой таблицы свободной структуры.
"таблицы свободной структуры" означает, что по понедельникам, - в неё будут добавлять поля, а по пятницам - дропать ? :))
Есть такая партия такой триггер ! :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
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


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
(затронуто строк: 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)

...
Рейтинг: 0 / 0
02.11.2019, 11:07
    #39884577
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
msLexalexeyvgВместо хранения логов в отдельной таблице логов, они будут лежать в той же рабочей таблице. Зачем, если логи нужны раз в год, для разработчика или администратора?
Вообще, таблица версий в темпорал тейблс - это отдельная таблица. Её вообще можно создать вручную, в своей файловой группе и со своим набором индексов.Ой, действительно, ошибся...
...
Рейтинг: 0 / 0
02.11.2019, 21:03
    #39884651
defragmentator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
court,

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

Короче, появилась мысль вытащить курсором список полей в таблице и через
EXECUTE по одному сравнивать их старое и новое значение.
...
Рейтинг: 0 / 0
02.11.2019, 21:13
    #39884656
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
defragmentatorДа, вроде б ничего.
Но это надо быть спецом по обработке XML, а я только простейшие примеры знаю.Так вам court дал готовый код универсального триггера, даже разбираться не надо.

Тем более, что работу с XML в сиквеле всё равно полезно будет освоить.
...
Рейтинг: 0 / 0
02.11.2019, 23:45
    #39884689
defragmentator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
alexeyvgготовый код универсального триггера, даже разбираться не надо.

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

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


Сорри за подковырку.
...
Рейтинг: 0 / 0
03.11.2019, 00:22
    #39884694
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
defragmentatoralexeyvgготовый код универсального триггера, даже разбираться не надо.
не тождественно
alexeyvgвсё равно полезно будет освоить.
Сорри за подковырку.Ну, вы можете просто вставить, с минимальными усилиями, по методологии разработки "паст-копи из интернета".

А можете и поразбираться, если захотите.
...
Рейтинг: 0 / 0
04.11.2019, 10:49
    #39884881
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
defragmentatorДобрый вечер!
Хочу написать триггер, который будет писать в лог
историю изменений некой таблицы свободной структуры.
Такое возможно?

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

таблица "свободной структуры"? девушка "свободной профессии".
вы собрались логгировать изменение структуры таблицы или данных?
...
Рейтинг: 0 / 0
04.11.2019, 15:04
    #39884971
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запись истории изменнеий в лог
iapdefragmentatorДобрый вечер!
Хочу написать триггер, который будет писать в лог
историю изменений некой таблицы свободной структуры.
Такое возможно?

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

Можно ещё ознакомиться со статьёй Журналирование изменений структуры БД и данных
Правда, она написана, когда только вышел SQL2005. Но всё равно полезно.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запись истории изменнеий в лог / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]