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 (запрошенное количество столбцов превышает максимальное число, поддерживаемое для отображения в таблице результатов):
Это на самом деле ошибка рендеринга; Сетка, используемая в Query Tool, ограничивается 1.000 столбцами. Большие объемы столбцов вызывают очень медленное время отклика пользовательского интерфейса.
Нажав кнопку "Скрыть пустые столбцы" или используя Invantive Data Hub в качестве пользовательского интерфейса, вы можете получить фактические результаты:
Обратите внимание на всплывающую подсказку: заголовок отображает несколько естественных меток, но фактическое имя столбца отображается во всплывающей подсказке.
Запишите имена нужных вам столбцов и заполните таблицу в памяти только теми столбцами, которые вам нужны, например:
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):