ms sql, посмотреть данные до commit tran
От: #John Европа https://github.com/ichensky
Дата: 10.05.16 12:59
Оценка:
Здравствуйте,

можно ли как-то одним скриптом посмотреть какие изменения будут в бд во все таблицах
после того как будет выполнена операция `commit tran`?
begin tran
delete from xxx;
insert into yyy('aa', 34);
update zzz set ff='ttt';

-- тут скриптом вытянуть список всех таблици и diff между данными 
commit tran
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
ms sql diff transaction commit tran
Re: ms sql, посмотреть данные до commit tran
От: Milena США  
Дата: 10.05.16 14:30
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте,


J>можно ли как-то одним скриптом посмотреть какие изменения будут в бд во все таблицах

J>после того как будет выполнена операция `commit tran`?

Это можно сделать в триггере, где таблица deleted содержит старые данные до изменений, а inserted — новые данные после изменений. Там же можно заставить откатить транзакцию, если результаты сравнения неудовлетворительны.
Re[2]: ms sql, посмотреть данные до commit tran
От: #John Европа https://github.com/ichensky
Дата: 10.05.16 18:14
Оценка:
Здравствуйте, Milena, Вы писали:

M>Это можно сделать в триггере, где таблица deleted содержит старые данные до изменений, а inserted — новые данные после изменений. Там же можно заставить откатить транзакцию, если результаты сравнения неудовлетворительны.

а можно это сделать без тригерра, и указания таблицы?
время от времени мне надо набрасывать одиночные скрипты и собирать данные для заметок
или просто что бы их проанализировать,
а т.к. нормальное логирование/тестирование делать накладно по времени
и триггеры писать долго + они вносят дополнительную сложность в систему,
хотелось бы простое, пусть не сильно гибкое одиночное решение.
begin tran
delete from xxx;
insert into yyy('aa', 34);
update zzz set ff='ttt';

-- тут скриптом вытянуть список всех таблици и diff между данными 
-- вставляет что-то тип такого и получаем профит
exec sp_diff;

commit tran

и в лог падают записи ввида:
xxx
---
>>>
bob, 1, superhero
chack, 2, man

yyy
---
<<<
aa, 34

zzz
---
>>>
red, 1, cake
<<<
red, 1, ttt
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[3]: ms sql, посмотреть данные до commit tran
От: Milena США  
Дата: 10.05.16 18:22
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте, Milena, Вы писали:


J>а т.к. нормальное логирование/тестирование делать накладно по времени

J>и триггеры писать долго + они вносят дополнительную сложность в систему,
Почему сложно и в чем эта сложность? Триггер — это обычная хранимка, которая автоматически вызывается, когда происходит транзакция. Ваш код ниже, выделенный жирным, фактически делает именно это — на каждую транзакцию вы будете явно вызывать хранимку, которая будет писать в лог историю обновлений. Многие девелоперы используют триггеры именно, чтобы делать логирование.

J>[sql]

J>begin tran
J>delete from xxx;
J>insert into yyy('aa', 34);
J>update zzz set ff='ttt';

J>-- тут скриптом вытянуть список всех таблици и diff между данными

J>-- вставляет что-то тип такого и получаем профит
J>exec sp_diff;

J>commit tran
Re[4]: ms sql, посмотреть данные до commit tran
От: #John Европа https://github.com/ichensky
Дата: 10.05.16 19:18
Оценка:
Здравствуйте, Milena, Вы писали:

M>Почему сложно и в чем эта сложность?

В системе появляется еще один объект который может влиять на целосность данных,
причем который срабатывает автоматически.
Что бы писать одиночные(да и не только) скрипты надо знать что в бд есть такой триггер.
Если таких бд много, тригерров много — мне надо будет сильнее напрягаться что бы вспоминать где в какой бд
что лежит. Да и новым людям(не обязательно технарям) тоже надо будет все это рассказывать
(ведь если не рассказать, потом еще придется исправлять внезапные проблемы и все-равно рассказывать).
И надо будет писать логику, что бы все эти вспомогательные тригерра не деплоились на прод. т.к. там они точно ненужны.
>Триггер — это обычная хранимка, которая автоматически вызывается
— и это большой минус для кода, который будет выброшен через 10минут,
т.к. нельзя полностью контролировать процесс выполнения.
хотелось бы что бы лог был не после того как будет выполнена инструкция "commit tran",
а в любой указанной строче между другими инструкциями, и в случаее чего можно было откатиться:

begin tran
exec sp_diff;
delete from xxx;
exec sp_diff;
insert into yyy('aa', 34);
exec sp_diff;
update zzz set ff='ttt';
exec sp_diff;

commit tran
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[3]: ms sql, посмотреть данные до commit tran
От: _ABC_  
Дата: 10.05.16 19:31
Оценка:
Здравствуйте, #John, Вы писали:

J>а можно это сделать без тригерра, и указания таблицы?

Без предварительного указания таблиц, боюсь, не получится.
В сторону Change Data Capture смотрели? Может быть подойдет для основы?
Re: ms sql, посмотреть данные до commit tran
От: BOBKA_XPEH Новая Зеландия  
Дата: 23.05.16 08:31
Оценка:
Здравствуйте, #John, Вы писали:

J>можно ли как-то одним скриптом посмотреть какие изменения будут в бд во все таблицах

J>после того как будет выполнена операция `commit tran`

Можно например до начала выполнить селект с теми же условиями что и апдейт/делейт до начала транзакции и сразу перед коммитом. Еше триггеры можно посвисть, CDC, или чендж трекинг. Вариантов много.
Гей хлопци — шлях в Европу!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.