Ошибка ссылочной целостности при обработке измерения для куба
Сбой одного из наших производственных кубов со следующим сообщением об ошибке:
Источник: службы Analysis Services выполнить DDL Задача службы Analysis Services выполнить DDL Описание задачи: ошибки в механизме хранения OLAP: ключ атрибута не может быть найден при обработке: таблица: 'dbo_vw_FACT_OperationalTimeSheetData', столбец: 'CurrentHomeLaborOrg', значение: '117-MARKETPLACE-38 ". Атрибут "KeyOrganisation". Предупреждение об окончании работы: 2013-07-22 06:26:07.51 Код: 0x811F0002
Источник: службы Analysis Services выполнить DDL Задача службы Analysis Services выполнить DDL Задача Описание: Ошибки в механизме хранения OLAP: ключ атрибута был преобразован в неизвестный элемент, поскольку ключ атрибута не был найден. Ключ атрибутаОрганизация измерения: текущая организация дома из базы данных: LadbrokesReporting2005, куб: клон MIS, группа мер: табель времени Kronos, раздел: 201307, запись: 179774. Предупреждение о конце
В ходе обширного поиска в Google по приведенному выше сообщению об ошибке я узнал, что это связано со ссылочной целостностью, т.е. некоторые строки в таблице фактов не могут быть связаны с таблицей измерений. В моем предыдущем анализе я полагал, что для некоторых значений, подобных приведенному выше в сообщении об ошибке "117-MARKETPLACE-38" в таблице фактов, формат в таблице измерений был "117_Marketplace_38". Тем не менее, я раскопал некоторые поразительные факты:
Запрос для представления, которое заполняет факт, преобразует данные в формат "117-MARKETPLACE-38". Формат данных в исходных таблицах - "117_Marketplace_38".
Есть много других записей в формате "117-Marketplace-38". Однако, похоже, ошибка присутствует только для этой записи. Так почему же другие получают признание, но это не так?
У меня закончились идеи. Следовательно, было бы здорово, если бы кто-то мог помочь мне в этом.
2 ответа
Вы уверены, что измерение обрабатывается? Помните, что, поскольку он связывает факты с измерениями, он делает это с измерением SSAS, а не с базовой таблицей SQL. Попробуйте сначала запустить процесс (обновление) в измерении?
В своем оригинальном сообщении вы смешиваете верхний и нижний регистры, MARKETPLACE и Marketplace. Это так в источнике? Может быть, это не относится к ним как к одному и тому же. Я видел, что SSAS имеет проблемы с "Id" против "ID"
Невозможно найти возможный родственник ключа атрибута ssas, даже если он существует и не является дубликатом
Отредактированные комментарии в ответ после принятия.
Я получил это же сообщение об ошибке, но в моем случае мне пришлось по-другому его обработать: подробности ниже для тех, кто сталкивается с той же проблемой.
В моем сценарии я подключал свою таблицу фактов к другой таблице фактов через таблицу мостов. Эта таблица моста была сформирована через INNER JOIN
так что у него были только записи, совпадающие в обоих; законно, то определенные строки в FactTableA
не были в BrgTable
присоединение к FactTableB
,
Позволять FactTableA
обрабатывать, даже когда не было действительных ссылок на BrgTable
Я следовал этим инструкциям TechNet:
Проблемы ссылочной целостности в таблице фактов
В таблице фактов продаж есть записи с product_id, которых нет в таблице измерений продукта. Сервер выдаст ошибку KeyNotFound во время обработки раздела. По умолчанию ошибки KeyNotFound регистрируются и учитываются в предельном значении ошибки ключа, которое по умолчанию равно нулю. Следовательно, обработка не удастся при первой ошибке.
Решение состоит в том, чтобы изменить ErrorConfiguration в группе мер или разделе. Ниже приведены две альтернативы:
Set KeyNotFound=IgnoreError. Set KeyErrorLimit to a sufficiently large number.
Обработка ошибок KeyNotFound по умолчанию заключается в выделении записи факта неизвестному члену. Другой альтернативой является установка KeyErrorAction=DiscardRecord, чтобы полностью удалить запись таблицы фактов.
Мне пришлось перейти в раздел, связанный с ошибочной группой мер, открыть панель свойств, установить ErrorConfiguration на Custom
, а затем разверните Пользовательский и установите KeyNotFound в IgnoreError.