Материализованное представление с совокупностью столбцов - PullRequest
1 голос
/ 13 ноября 2009

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

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

T_RIDER
  RIDER_ID
  TMP_PONYLIST
  ...

T_RIDER_PONY
  RIDER_ID
  PONY_ID

T_PONY
  PONY_ID
  PONY_NAME
  ...

T_RIDER и T_PONY имеют отношение n: m через T_RIDER_PONY. T_RIDER и T_PONY имеют еще несколько столбцов, но здесь имеют значение только TMP_PONYLIST и PONY_NAME.

TMP_PONYLIST - это список разделенных точкой с запятой PONY_NAMES, представьте что-то вроде "Twisty Tail;Candy Cane;Lucky Leaf". Я бы хотел обновлять это поле независимо от того, что происходит с T_RIDER_PONY или T_PONY.

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

Вид должен быть создан следующим образом

CREATE MATERIALIZED VIEW
  V_TMP_PONYLIST 
BUILD IMMEDIATE
REFRESH COMPLETE ON COMMIT
AS SELECT 
  ...

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

  • WM_CONCAT -> недоступно в моем Oracle
  • Определяемый пользователем агрегат -> ORA-12054
  • ROW_NUMBER и SYS_CONNECT_BY_PATH -> ORA-12054

Я еще не пробовал:

  • Специальная функция
  • Функция Общая функция с использованием Ref Cursor
  • Функция COLLECT

Видите ли вы какой-либо шанс заставить что-либо из этого работать с материализованным представлением, или это бессмысленно? Знаете ли вы о других методах, которые могут работать с материализованным представлением?

Я использую Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi.

1 Ответ

2 голосов
/ 13 ноября 2009

Вы хотите создать ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ СОЕДИНЕНИЕ СОЕДИНЕНИЙ МАТЕРИАЛИЗИРОВАННЫЙ ВИД. Этот тип MV имеет много ограничений . По сути, все что угодно, кроме простых объединений, SUM, COUNT и AVG не будут обновляться с помощью COMMIT всеми действиями DML.

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

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

Вы уже заявили, что простое представление не будет работать из-за проблем с производительностью. Я бы посоветовал изучить другие варианты: триггеры позволят вам сохранить ваш существующий код, но у вас, вероятно, будет много непредвиденных побочных эффектов (сложные триггеры очень забавны). Процедурную логику проще всего кодировать / поддерживать, но вам придется фактически использовать ее и модифицировать свое приложение для использования нового API. Возможно, вам придется отозвать права на обновление базовой таблицы, чтобы убедиться, что таблицы обновляются через API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...