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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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