Файл состояния генератора суррогатных ключей, есть ли возможность прочитать файл с другого языка проги?

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

Из того, что я читал, это не похоже на файлы набора данных (.ds), где вы можете использовать инструмент DataStage Designer для его чтения. Я попытался создать небольшое приложение на C #, где оно читалось бы как двоичный файл. В различных статьях объясняется, что это 64-битное целое число без знака. Тем не менее, когда я пытаюсь его прочитать, он дает случайный набор чисел. Он начинается с единицы, затем цифр, заканчивающихся на 999, и затем повторяется. Я пробовал читать его с помощью класса преобразователя битов, но тоже не повезло.

Пока что единственное решение, которое я видел, - это создать параллельное или последовательное задание, которое получает максимальное число из базы данных, а затем создает с его помощью суррогатный ключ, как описано в http://it.toolbox.com/blogs/infosphere/datastage-8-tutorial-surrogate-key-state-files-17403.

Я не первый, кто пытался изменить это с помощью кода, и мне было любопытно, есть ли способ сделать это.

с использованием DataStage 8.7 Пробовал с C # BinaryReader.ReadUInt64, BinaryReader.ReadInt64 и BitConverter.ConvertToUInt64

Обновление 2016-10-19: частичный ответ заключается в том, что его можно читать как двоичный файл. Он разделен на 4 набора по 8 байтов. Примерно так (это можно увидеть с помощью шестнадцатеричного редактора.

01 00 00 00 00 00 00 00
00 00 00 00 00 00 00 05
00 00 00 00 00 00 00 08
00 00 00 00 00 00 00 08

Я думаю, что первый набор - это инкрементное число (+1, +5 и т. Д.).

Второй набор - это начальное значение

Третий набор - это следующий номер, который нужно присвоить

Четвертый набор, я думаю, это конец партии, которую нужно назначить. Если вы делаете партии 10 на 10, то третье - 10, а четвертое - 20, или, как я думаю, это работает.

Поэтому для чтения по коду вам нужно прочитать его с помощью двоичного считывателя и получить наборы по 8 байтов для преобразования в UINT64.

Вопрос все еще в силе, потому что я не уверен, что они означают.


person ThorDivDev    schedule 18.10.2016    source источник


Ответы (2)


Как вы думаете, зачем вам этап генератора суррогатных ключей? Альтернативным и гораздо более простым решением может быть этап Transformaer для нумерации и последовательный файл (или параметр) для его инициализации. Новый номер - после обработки - может быть записан обратно в последовательность базы данных. Таким образом, вам просто нужно работать с плоскими файлами без программирования.

Чтобы сгенерировать уникальные числа в трансформаторе (параллельном), вы должны рассмотреть разделы - эта формула будет делать

(@NUMPARTITIONS * ( @INROWNUM - 1)) +  @PARTITIONNUM + Max_Field1
person MichaelTiefenbacher    schedule 18.10.2016
comment
Мне нужно прочитать больше по этому вопросу, чтобы понять решение. Мне это нужно, потому что это уже сделано. Я просто пытаюсь решить проблему несоответствия суррогатных ключей при обновлении. Тем не менее, ваша формула выглядит полезной. - person ThorDivDev; 20.10.2016

Причина всего этого в том, что я ищу ошибку в файле состояния суррогатного ключа. Итак, когда вы перейдете к сложному преобразователю (извините, что нет изображений), вы перейдете к свойствам и увидите, что у него есть вкладка суррогатного ключа. У вас есть три настройки. Один для файла, один для начального значения, а другой для размера блока.

В этом файле хранится текущий суррогатный ключ. Я скоро объясню, как он форматируется. Начальное значение - это номер, с которого вы хотите начать, а размер блока - это резервная группа чисел для вашего трансформатора.

Файл форматируется с шагом 16 байт, первый - это текущий номер. Номер, который нужно назначить, - это номер + 1, а второй - конец размера блока. Это будет только 16 байтов, если вы не определите начальное значение или размер блока. если вы определите их, это будет 32 байта. Где последние два значения - это текущий номер и конец блока.

Итак, когда у вас есть два или более трансформаторов, использующих один и тот же файл. Он назначит блок с доступными номерами перед получением нового блока и увеличением размера файла еще на 16 байт, если это необходимо.

Итак, в чем была ошибка: когда вы не определяете размер блока, но определяете начальное значение, размер системного блока будет около 1000 или около того. Допустим, вы делаете небольшой пример, в котором все, что у вас есть, - это генератор строк, подключенный к трансформатору, который заканчивается последовательным файлом. Все, что вам нужно, это одна строка. Выполните это много раз, и скажем, ваше начальное значение равно 200. Это будет 200 201 203 204, (1), 205. По какой-то причине в DataStage 8.7 возникают ошибки, и когда вы не определяете размер блока, он возвращается к единице.

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

Если вы хотите, чтобы ошибка произошла быстрее, просто удалите файл и создайте новый с помощью C #, назначьте 4 значения UINT64, сохраненные как BYTES. первые два значения 1,1,200,300. В конце концов он сделает то, что я описал.

person ThorDivDev    schedule 28.10.2016