itgendch033: Резервные базы данных требуют, чтобы Invantive Data Replicator ограничил число столбцов до 1000 для 'ExactOnlineXML.XML.SubscriptionLines'

При выполнении пакетного сценария для репликации моих данных из Exact Online я получаю следующую ошибку:

Ошибка itgencun016: восклицательный знак itgendch033: для баз данных поддержки требуется Invantive Data Replicator, чтобы ограничить число столбцов до 1000 для "ExactOnlineXML.XML.SubscriptionLines".

Это происходит для следующего запроса:

select /*+ ods(true, interval '20 hours') */ count(*) 
from   ExactOnlineXML.XML.SubscriptionLines

То же самое касается ExactOnlineXML.XML.InvoiceLines,

Как я могу повторить эти таблицы, не увеличивая столбцы.

1 ответ

Invantive SQL не накладывает ограничений ни на длину имен столбцов, ни на количество столбцов для таблицы или представления.

Однако традиционные базы данных были разработаны в другое время и, как правило, ограничиваются именами столбцов, например, 30,128 символов и столбцами 1000, 1,024 или несколькими тысячами. Помните, что Oracle работал на 64 КБ (код 32 КБ, данные 32 КБ); это примерно размер этого вопроса и ответа:-)

При репликации данных из Exact Online в традиционную базу данных, такую ​​как Oracle, SQL Server или PostgreSQL, Invantive Data Hub будет использовать Invantive SQL для извлечения данных в этом случае из Exact Online, а затем массово загружать их в базу данных.

Однако данные должны соответствовать как именам столбцов, так и номерам столбцов.

Это главная причина, по которой имена столбцов такие странные; они помещаются в ограниченное количество символов независимо от оригинальных имен столбцов. Имена столбцов сгенерированных представлений также сокращаются путем удаления центральных частей с уникальным хешем MD5.

Для количества столбцов Data Hub просто строго проверяет, что в вашем источнике не более 1 000 столбцов. Exact Online XML API не имеет документации, описывающей, какие столбцы можно заполнить значением; просто XSD, который описывает все теоретические возможности, ведущие к миллионам столбцов.

Большинство таблиц Exact Online на основе XML были настроены таким образом, чтобы исключить пути имен столбцов, которые не имеют значений, но, тем не менее, они часто не помещаются в пределах 1000 столбцов.

Возможные решения:

  • Используйте вариант Exact Online REST API, который часто присутствует, а иногда и похож по функциональности и производительности (не всегда XML API устарел, но в целом лучше разработан для удобства использования). Так что проверьте, есть ли ExactonlineREST..SubscriptionLines,
  • Подробно опишите, какие столбцы нужно тиражировать.

Опишите столбцы для репликации

Последнее решение немного сложнее. Это также не поддается использованию продвинутых стратегий, таких как ручная загрузка (с веб-хуками) или умная выборка; это просто обычная копия с версиями или без них.

В качестве примера я выполнил запрос к 200 компаниям Exact с подписками при подключении к среде Data Replicator:

нормальный запрос в строках подписки

Обратите внимание, что /*+ ods(true) */ отсутствует, но подразумевается; репликация по умолчанию при подключении к Data Replicator.

Добавляя /*+ ods(false) */вы фактически указываете механизму SQL не отправлять данные для репликации в базу данных поставщику репликатора данных.

Когда я запускаю его, возникает другая ошибка itgenugs026 (запрошенное количество столбцов превышает максимальное число, поддерживаемое для отображения в таблице результатов):

Ошибка 2

Это на самом деле ошибка рендеринга; Сетка, используемая в Query Tool, ограничивается 1.000 столбцами. Большие объемы столбцов вызывают очень медленное время отклика пользовательского интерфейса.

Нажав кнопку "Скрыть пустые столбцы" или используя Invantive Data Hub в качестве пользовательского интерфейса, вы можете получить фактические результаты:

Результат по Точной Онлайн XML подписке

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

Запишите имена нужных вам столбцов и заполните таблицу в памяти только теми столбцами, которые вам нужны, например:

create or replace table my_subscriptions@inmemorystorage
as
select /*+ ods(false) */ 
       subscription_number_attr 
,      subscription_description
from   exactonlinexml..subscriptionlines

Теперь скопируйте эту таблицу обычным способом:

select /*+ ods(true, interval '1 second') */ 
       count(*) some_unneeded_data_to_force_replication
from   my_subscriptions@inmemorystorage

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

Для обновления вы можете использовать alter persistent cache [force] refresh, но таблица в памяти должна быть заполнена заранее.

Результирующая запись в хранилище будет:

изменение хранилища

Таблица фактов (см. Dcs _.... для хранилища данных с перемещением во времени):

таблица необработанных фактов

И по умолчанию именованным представлением является imy_my_subscription_r (imy - это аббревиатура от драйвера inmemorystorage):

текущая версия по умолчанию

Другие вопросы по тегам