Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
Будет не очень сложная система

Допустим есть главная информационная таблица.
Мне нужно иметь возможность запросить всю таблицу, а так же отслеживать изменения периодически
Причём желательно с комментарием, что изменилось

Вижу два пути:
1) каждый раз запрашивать всю таблицу и вручную отслеживать изменения
2) завести поле типа UpdateNum и каждый раз запрашивать where UpdateNum > значение

С целью познавания баз на реальных задачах, а так же минимизируя расход трафика и вычислительных мощностей на поиск изменений, хотелось бы пойти по второму пути.

Но я совсем новичок (в БД), поэтому посоветуйте:
1) как эту задачу реализовать (чтобы при изменении записей отслеживать текущий UpdateNum, инкрементировать, и записи)
2) статейки по MS SQL Server Management Studio или другим утилитам, где редактирование таблиц можно осуществлять через GUI, а не SQL-запросы
25 мар 13, 12:29    [14091526]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Change Data Capture
?
25 мар 13, 12:32    [14091542]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SOFT FOR YOU
2) завести поле типа UpdateNum и каждый раз запрашивать where UpdateNum > значение

Не очень понятно, что вы имеете в виду. Приведите пример структуры данных, которую вы хотите использовать для этого варианта.
25 мар 13, 12:42    [14091630]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Журналирование изменений структуры БД и данных
25 мар 13, 12:47    [14091661]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
только не UpdateNum c числом, a UpdateDatetime с датой
25 мар 13, 13:36    [14091931]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
спасибо всем за участие, прокомментирую пока это:
Гость333
Не очень понятно, что вы имеете в виду. Приведите пример структуры данных, которую вы хотите использовать для этого варианта.


Картинка с другого сайта.
25 мар 13, 18:44    [14093907]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
в таблице по привычке написал "Const" вместо "Cost" :)
26 мар 13, 09:29    [14095205]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SOFT FOR YOU,

Я так понимаю, вы изобразили последовательные состояния таблицы? То есть на первом шаге там появилась одна запись, на втором шаге — добавилась ещё одна, ... , на шестом шаге в таблице хранятся четыре записи?

Ок, пусть у вас есть таблица в финальном состоянии. Вы выполняете запрос:
select * from Таблица where UpdateNumber > 1
Запрос возвращает записи, в которых UpdateNumber = 4, 5 и 6. Обновления с номерами 2 и 3 не возвращаются, т.к. они уже затёрты. Такая ситуация вас устраивает, или не совсем? :-)

Дальше, пусть в какой-то строке на каком-то шаге изменился более, чем один параметр. Например, одновременно наименование (изначально было введено с орфографической ошибкой) и цена. Как это будет отображаться в вашей схеме данных?
26 мар 13, 11:47    [14095935]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
SOFT FOR YOU
Вижу два пути:
1) каждый раз запрашивать всю таблицу и вручную отслеживать изменения
2) завести поле типа UpdateNum и каждый раз запрашивать where UpdateNum > значение
Таким образом вы пропускаете изменения данных между опросами.

Если устраивает, то в MSSQL для варианта 2, то есть для "UpdateNum", есть специальное средство - timestamp. Это целочисленный номер версии строки, глобальный (уникальный) для БД, меняется при любом изменении любого поля.

Если не устраивает, воспользуйтесь либо встроенным механизмом CDC, либо делайте логирующие триггеры.
26 мар 13, 11:53    [14095971]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
Гость333
Я так понимаю, вы изобразили последовательные состояния таблицы? То есть на первом шаге там появилась одна запись, на втором шаге — добавилась ещё одна, ... , на шестом шаге в таблице хранятся четыре записи?

Да, Вы всё правильно поняли
Сколько бы раз не изменилась база данных, заказывая данные начиная с конкретного UpdateNumber - я получу обновления с какого-то промежутка времени, а не всю таблицу целиком
Вопрос - как при добавлении/изменении таблицы проставлять этот UpdateNumber

Иными словами в базе (или таблице) должна хратиться какая-то переменная типа UpdateNumber
При добавлении/изменении - я беру эту переменную, инкрементирую её и значение заношу в столбец UpdateNumber
Можно ли это как-то реализовать и как настроить таблицу/запрос, чтобы выборка обновлений проходила с максимальной скоростью. По логике вроде бы можно было бы задать это поле ключевым. Но ключ насколько я понимаю работает на равенство. А будет ли профит при сравнении на > значение ?

alexeyvg
Если устраивает, то в MSSQL для варианта 2, то есть для "UpdateNum", есть специальное средство - timestamp.

а можно поподробнее ?


P.S.
и ещё меня интересует статья по MS SQL Server Management Studio или другим утилитам, где редактирование таблиц можно осуществлять через GUI
26 мар 13, 21:51    [14099087]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
SOFT FOR YOU
alexeyvg
Если устраивает, то в MSSQL для варианта 2, то есть для "UpdateNum", есть специальное средство - timestamp.

а можно поподробнее ?
Есть такой тип данных - rowversion (это новое название типа timestamp, лучше использовать rowversion)

Из документации:
BOL
Это тип данных, который представляет собой автоматически сформированные уникальные двоичные числа в базе данных. Тип данных rowversion используется в основном в качестве механизма для отметки версий строк таблицы.

Каждая база данных имеет счетчик, который увеличивается при каждой операции вставки или обновления в таблице, содержащей столбец типа rowversion в базе данных. Этот счетчик типа rowversion используется для работы с базами данных. Происходит отслеживание относительного времени базы данных, а не действительного времени, которое может быть связано с часами. В таблице может быть только один столбец типа rowversion. Каждый раз при изменении или вставке строки, содержащей столбец типа rowversion, значение увеличенной rowversion вставляется в столбец типа rowversion. Из-за этого свойства столбец типа rowversion нежелательно использовать в ключе, особенно в первичном ключе. Любое обновление, сделанное в строке, изменяет значение rowversion и значение ключа. Если столбец является первичным ключом, старое значение ключа больше недействительно и внешние ключи, ссылающиеся на старое значение, становятся недействительными. Если на таблицу ссылается динамический курсор, все обновления изменяют положение строк в курсоре. Если столбец является ключом индекса, все обновления в строках данных также приводят к обновлению индекса.


Т.е. это число, которое само будет изменяться на новое при любом изменении записи таблицы.

Т.о. вам не нужно думать, "как при добавлении/изменении таблицы проставлять этот UpdateNumber", он проставится сам.

Соответственно запоминаете последний прочитанный rowversion при записи логов, потом при следующем логировании читаете все записи, в которых rowversion больше сохранённого (и опять сохраняете последний rowversion)
26 мар 13, 22:58    [14099291]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
alexeyvg
Есть такой тип данных - rowversion (это новое название типа timestamp, лучше использовать rowversion)

пожалуй это то что нужно!
спасибо

теперь второй вопрос
можете ли посоветовать
SOFT FOR YOU
2) статейки по MS SQL Server Management Studio или другим утилитам, где редактирование таблиц можно осуществлять через GUI, а не SQL-запросы
27 мар 13, 15:03    [14102205]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SOFT FOR YOU
можете ли посоветовать
SOFT FOR YOU
2) статейки по MS SQL Server Management Studio или другим утилитам, где редактирование таблиц можно осуществлять через GUI, а не SQL-запросы

Использование среды SQL Server Management Studio
27 мар 13, 15:07    [14102234]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
спасибо

прошу прощения за нубские вопросы
Картинка с другого сайта.

1) как задать тип rowversion, в списке не нашёл. версия 2008 R2
2) правильно ли выбирать тип int для поля-ключа
3) как определить длинну строкового поля? как принято выбирать?
29 мар 13, 20:07    [14114660]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
SOFT FOR YOU
1) как задать тип rowversion, в списке не нашёл. версия 2008 R2
2) правильно ли выбирать тип int для поля-ключа
3) как определить длинну строкового поля? как принято выбирать?
1. испоьзуйте timestamp, это синоним rowversion (странно, что rowversion нету, никогда бы не подумал)

2. Да, нормально. Но вообще проектирование делается по требованиям. для каих то случаев выбирают другие типы.

3. Из бизнес-требований.
29 мар 13, 20:43    [14114760]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
alexeyvg

> 1. испоьзуйте timestamp, это синоним rowversion (странно, что rowversion нету, никогда бы не подумал)

а timestamp вроде бы тоже нет

> 3) как определить длинну строкового поля? как принято выбирать?

ну вот к примеру есть поля LOGIN и FIO
какие для них длины выбирать ?
30 мар 13, 13:24    [14116105]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
SOFT FOR YOU
ну вот к примеру есть поля LOGIN и FIO
какие для них длины выбирать ?

По одному символу для каждого
30 мар 13, 22:48    [14117275]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
SOFT FOR YOU
alexeyvg

> 1. испоьзуйте timestamp, это синоним rowversion (странно, что rowversion нету, никогда бы не подумал)

а timestamp вроде бы тоже нет
Точно нет? Скриншот покажите, и версию сиквела.
SOFT FOR YOU
> 3) как определить длинну строкового поля? как принято выбирать?

ну вот к примеру есть поля LOGIN и FIO
какие для них длины выбирать ?
Я же говорю - спрсить у того, кто даёт задание, у заказчика.

Обычно некий компромисс (потому что заказчик скажет, что хочет неограниченный размер, но реально емцу это не нужно, ну и технически неосуществимо).
Например, FIO можно выбрать длинну больше, чем максимальная, которую видел заказчик, а для LOGIN - исходя из традиций бизнеса заказчика и обычных предпочтений в ИТ - индустрии.
30 мар 13, 23:49    [14117441]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
alexeyvg
Точно нет? Скриншот покажите, и версию сиквела.

завтра на работу приду - покажу
версия 2008 R2

alexeyvg
Я же говорю - спрсить у того, кто даёт задание, у заказчика.

у нас небольшая внутренняя информационная система
проектировщик, заказчик и исполнитель - я
31 мар 13, 12:27    [14118246]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
а спрашивать у юристов какая длинна строк в базе - как то глупо
они ответят "нам всёравно, лишь бы работало"
31 мар 13, 12:28    [14118248]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
SOFT FOR YOU
у нас небольшая внутренняя информационная система
проектировщик, заказчик и исполнитель - я
Заказчик - это тот, в чьих интересах делается система, кто будет её использовать.
SOFT FOR YOU
а спрашивать у юристов какая длинна строк в базе - как то глупо
они ответят "нам всёравно, лишь бы работало"
То есть это юристы.

Нужно уметь спрашивать, неужели они не представляют, что им надо?
Им нужно именно чтоб "работало", то есть чтобы они могли ввести любой реальный ФИО. Ну вот и прикиньте, какую длинну надо. Допустим, 200 символов.
31 мар 13, 13:05    [14118321]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
alexeyvg

ну я предполагаю, что специалисты БД часто сталкиваются с задачей определения длинны и уже выработали какой-то подход
конечно можно сделать 200
но хочется цивилизованнее подходить к задаче
31 мар 13, 13:55    [14118408]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
SOFT FOR YOU
ну я предполагаю, что специалисты БД часто сталкиваются с задачей определения длинны и уже выработали какой-то подход

Специалисты собирают требования бизнесса сначала. А потом принимают решение.
А собирать требования - это вовсе не спрашивать бизнесс, какой длины должны быть поля.
31 мар 13, 14:25    [14118445]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
SOFT FOR YOU
ну я предполагаю, что специалисты БД часто сталкиваются с задачей определения длинны и уже выработали какой-то подход
конечно можно сделать 200
Нет конечно.

Как программисты могут самостоятельно определить какую то абракадабру, относящуюся к бизнесу? Нету никаких способов.

Конечно, если модифицируется какая то старая система, или пишется что то, что будет работать с существующими модулями/системами, или будет делаться импорт/экспорт в сторонние системы, тогда программист может принять решение, какой длины сделать поле для "кода УКППДЖ", а иначе только спрашивать.
SOFT FOR YOU
и уже выработали какой-то подход
Подход - это фаза определения бизнес-требований, только это в общем не задача программистов.
31 мар 13, 18:58    [14118920]     Ответить | Цитировать Сообщить модератору
 Re: Отслеживать изменения в таблице  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 3182
alexeyvg
1. испоьзуйте timestamp, это синоним rowversion (странно, что rowversion нету, никогда бы не подумал)

timestamp есть
а почему rowversion нет? очень странно

alexeyvg
> 2) правильно ли выбирать тип int для поля-ключа
2. Да, нормально. Но вообще проектирование делается по требованиям. для каих то случаев выбирают другие типы.


а как сделать, чтобы при добавлении в таблицу целочисленный ID сам проставлялся ?

---------------------------
И ещё у меня вопрос.
Вот есть у меня несколько таблиц. Пользователи, справочник такой-то, справочник такой-то, общая информационная таблица, ...
Мне нужно будет периодически получать обновления всех таблиц.
По идее получается: сколько таблиц - столько запросов новых данных
Вопрос
Можно ли как-то уменьшить количество запросов? Например по одному запросу получить сразу все обновления со всех таблиц
Или иметь отдельную табличку, в которой будут timestamp-ы (rowversion-ы) по всем таблицам? В которой будет указано, какие таблички обновлены, какие нет
1 апр 13, 09:58    [14119944]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить