powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Отслеживание изменений. Вручную или (Change Data Capture или Change Tracking)?
7 сообщений из 7, страница 1 из 1
Отслеживание изменений. Вручную или (Change Data Capture или Change Tracking)?
    #39468771
mDanilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Впервые столкнулся с задачей. Нужен авторитетный совет, вручную делать логирование изменений, или воспользоваться CDC или CT.
Склоняюсь к ручному. Подробности:

Магазины
Код: sql
1.
2.
3.
4.
5.
6.
7.
create table Shop
(
[Id] int identity(0,1) primary key,
[Name] varchar(250) not null,
Address varchar(250) not null,
Unused bit not null
)



Товары в розничном магазине
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table Item
(
[Id] int identity(0,1) primary key,
GroupId int not null,
[Name] varchar(100) not null,
NameCassa varchar(50) not null,
NamePriceList varchar(50) not null,
NameLabel varchar(50) not null,
Volume decimal(6,3) not null,
LifeTime int not null,
composition varchar(400) not null
)



Допуски и наценки товаров на магазинах
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table Item
(
ShopId int, 
ItemId int,
TradePermis bit not null,
Price real not null

constraint pkIIdShId primary key (ShopId, ItemId) ,
constraint fkShId foreign key (ShopId) REFERENCES Shop(Id),
constraint fkIId foreign key (ItemId) REFERENCES Item(Id)
)




Нужно логировать изменения атрибутов таблиц Item (строк > 210к)и ShopItem ( > 210к * кол-во магазинов(Shop) ).
Каждый день в таблицах Item и ShopItem примерно по 1.5к изменений в каждой.
Задача состоит в том, чтобы высылать в магазины из головного офиса не всю таблицу, а только изменения за день.

Прочитал про CT и CDC по диагонале на хабре и линки с них.
В Change Tracking не хранится время изменения. И значение измененных атрибутов, только версии изменений, операции и первичные ключи.
В Change Data Capture, как я понял, если меняется значение одного атрибута в строке, то логируется все атрибуты. А в оригинальной таблице Item их много(=21).

Ручное решение:
Таблица, логирующая изменения
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table sysColumns_log
(
Id bigint identity(0,1)  primary key,
pkId smallint not null,     --object_id из sys.objects
column_id int smallint,  --column_id из sys.columns 
pkValue xml not null,   --значение первичного ключа.
ValueNew sql_variant not null,  --новое логируемое значение атрибута,
Time datetime,      --время изменения
OpId int               --операция (добавить/удалить, изменить, отправить данные)
)




pkValue имеет тип xml ибо первичный ключ может быть составным. Я специально вначале привёл в пример 2 таблицы, где у таблицы Item первичный ключ по полю Id, а ShopItem по ShopId и ItemId,
т.е. значения будут примерно следующие:
Для Item:
<Id>1</Id>,
<Id>2</Id>,
<Id>999</Id>
Для ShopItem:
<ShopId>1</ShopId><ItemId>2</ItemId>,
<ShopId>1</ShopId><ItemId>999</ItemId>

Если что: я помню, что sys.column_id уникален только для одного sys.object_id. Но у меня в таблице есть object_id первичного ключа таблицы, по нему можно найти object_id таблицы, которой принадлежит колонка


Собственно хотел бы знать мнение гуру. Больше читать, про CT, CDC или ручное решение приемлемо? Если RTFM, то что именно
...
Рейтинг: 0 / 0
Отслеживание изменений. Вручную или (Change Data Capture или Change Tracking)?
    #39468783
mDanilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mDanilov,
Поправка:
1) Описка: таблицу sysColumn_log правильнее назвать ObjectChanging_log чтобы никто не запутался
2) Не пояснил: pkId - это object_id первичного ключа из sys.object. По нему уже понятно по какой таблице идет логирование
...
Рейтинг: 0 / 0
Отслеживание изменений. Вручную или (Change Data Capture или Change Tracking)?
    #39468807
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы не делал одну таблицу для логгирования:
1. Неудобно ни писать ни читать.
2. Для логгирования 1 записи таблицы с многими полями нужно создавать много записей в лог.

Ваши аппетиты на логгирование непременно вырастут. И этой таблицы все равно не хватит.

Делайте отдельные лог-таблицы подобной оригиналу структуры.
Можно вообще объединить ф-цию хранения инфы и логирования просто добавив дату в осн. таблицу. :)

Зачитывать оттуда ф-цией, кот. достанет нужное значение на нужную дату.
...
Рейтинг: 0 / 0
Отслеживание изменений. Вручную или (Change Data Capture или Change Tracking)?
    #39469079
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mDanilovКаждый день в таблицах Item и ShopItem примерно по 1.5к изменений в каждой.
Задача состоит в том, чтобы высылать в магазины из головного офиса не всю таблицу, а только изменения за день.вам нужна вся история изменений за день или только самое последнее изменение?
...
Рейтинг: 0 / 0
Отслеживание изменений. Вручную или (Change Data Capture или Change Tracking)?
    #39469154
mDanilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дедушка,
Последнее
...
Рейтинг: 0 / 0
Отслеживание изменений. Вручную или (Change Data Capture или Change Tracking)?
    #39469157
mDanilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mDanilov,
LSV правильно сказал, что в перспективе аппетиты логирования вырастут, и изменения из других таблиц тоже придётся логировать.
Именно поэтому я и стараюсь хранить логи в одной таблице, чтобы новые не создавать. Максимум - новые процедуры и триггеры

Основной то вопрос у меня все-таки такой: Я правильно понял, что для моей задачи CT и CDC не подходит? И надо вручную делать?
...
Рейтинг: 0 / 0
Отслеживание изменений. Вручную или (Change Data Capture или Change Tracking)?
    #39476884
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mDanilovДедушка,
Последнее
для твоей задачи хватит простого поля "last_update_datetime" в каждой таблице обновляемого триггером.
И раз в сутки пересылаешь то, что изменилось за день. (Тебе же не нужна вся история изменений)
Всё, профит.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Отслеживание изменений. Вручную или (Change Data Capture или Change Tracking)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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