Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
defragmentator Member Откуда: Сообщений: 20504 |
Добрый вечер! Хочу написать триггер, который будет писать в лог историю изменений некой таблицы свободной структуры. Такое возможно? Насколько помню, в функцию UPDATE передаётся фиксированнное имя поля. Есть ещё функция COLUMNS_UPDATED(), но там по битам разбирать нужно. Есть ли смысл браться? |
1 ноя 19, 21:07 [22008493] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Они работают совсем не так, как вы думаете. |
||
1 ноя 19, 21:51 [22008514] Ответить | Цитировать Сообщить модератору |
Андрей Юниор Member Откуда: Москва Сообщений: 691 |
Почему не https://docs.microsoft.com/ru-ru/sql/relational-databases/tables/temporal-tables?view=sql-server-2017 ? |
2 ноя 19, 00:46 [22008550] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
Это, конечно, интересно, только чем inserted.* и deleted.* хуже ? Сообщение было отредактировано: 2 ноя 19, 06:31 |
||
2 ноя 19, 06:31 [22008587] Ответить | Цитировать Сообщить модератору |
Андрей Юниор Member Откуда: Москва Сообщений: 691 |
Отсутствием необходимости вручную делать логи и синтаксисом запросов: появляется возможность использоваться FOR SYSTEM_TIME. Но вместе с тем будет вагон и маленькая тележка ограничений, но это другой вопрос ![]() |
||
2 ноя 19, 09:16 [22008603] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Использовать temporal tables для логирования ИМХО слишком избыточно. Вместо хранения логов в отдельной таблице логов, они будут лежать в той же рабочей таблице. Зачем, если логи нужны раз в год, для разработчика или администратора? |
||||
2 ноя 19, 09:29 [22008606] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
Вообще, таблица версий в темпорал тейблс - это отдельная таблица. Её вообще можно создать вручную, в своей файловой группе и со своим набором индексов. |
||||
2 ноя 19, 10:39 [22008617] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2253 |
"таблицы свободной структуры" означает, что по понедельникам, - в неё будут добавлять поля, а по пятницам - дропать ? :)) Есть 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
|
|||
2 ноя 19, 10:56 [22008627] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||||
2 ноя 19, 11:07 [22008633] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
court, Да, вроде б ничего. Но это надо быть спецом по обработке XML, а я только простейшие примеры знаю. Короче, появилась мысль вытащить курсором список полей в таблице и через EXECUTE по одному сравнивать их старое и новое значение. |
2 ноя 19, 21:03 [22008824] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Тем более, что работу с XML в сиквеле всё равно полезно будет освоить. |
||
2 ноя 19, 21:13 [22008829] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
не тождественно
Сорри за подковырку. |
||||
2 ноя 19, 23:45 [22008886] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
А можете и поразбираться, если захотите. |
||||||
3 ноя 19, 00:22 [22008902] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3984 |
таблица "свободной структуры"? девушка "свободной профессии". вы собрались логгировать изменение структуры таблицы или данных? |
||
4 ноя 19, 10:49 [22009250] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
независимо от изменения значения поля. Тем более, что строк в inserted/deleted может быть много, а измениться могут не все. Кроме того, триггер запускается и в отсутствие каких-либо изменений. То же самое касается и функции COLUMNS_UPDATED(). Можно ещё ознакомиться со статьёй Журналирование изменений структуры БД и данных Правда, она написана, когда только вышел SQL2005. Но всё равно полезно. |
||||||||
4 ноя 19, 15:04 [22009387] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |