Я хотел бы автоматически обновить столбец базы данных агрегированием другого столбца. Есть три таблицы, связанные:Автоматическое обновление поля в базе данных
T_RIDER
RIDER_ID
TMP_PONYLIST
...
T_RIDER_PONY
RIDER_ID
PONY_ID
T_PONY
PONY_ID
PONY_NAME
...
T_RIDER
и T_PONY
имеющие п: отношения м через 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
.
Моя первая идея состояла в том, чтобы иметь триггеры на T_RIDER_PONY
и T_PONY
. Проблема в том, что в триггере невозможно читать T_RIDER_PONY
, я всегда получаю ORA-04091
. Я нашел несколько советов о работе с тремя триггерами и переменными пакета, но это звучит слишком сложно.
Возможно, вы думаете, что мне лучше изменить схему или полностью избавиться от TMP_PONYLIST
. Это варианты, но не тема этого вопроса. На данный момент Меня интересуют только ответы, которые не требуют каких-либо изменений в моих приложениях. (ни одно приложение не работает непосредственно с таблицами, только виды, поэтому допускаются обманки с представлениями).
Итак, как я могу автоматически обновлять TMP_PONYLIST
? Как конкатенировать строку - интересная подзадача, я еще не нашел элегантного решения.
Я использую Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi.
UPDATE
Мне нравится идея использования материализованного представления. То, что я это:
CREATE MATERIALIZED VIEW
V_TMP_PONYLIST
BUILD IMMEDIATE
REFRESH COMPLETE ON COMMIT
AS SELECT
R.RIDER_ID, string_agg(P.PONY_NAME) AS TMP_PONYLIST
FROM
T_PONY P, T_RIDER R, T_RIDER_PONY RP
WHERE
P.PLOTGROUP_ID=RP.PLOTGROUP_ID AND
R.QUEUE_ID=RP.QUEUE_ID
GROUP BY R.RIDER_ID;
string_agg
не показывается, потому что это долго, и я думаю, что это не имеет отношения.
Он не компилируется с ON COMMIT
, я получаю ORA-12054
. Насколько я понимаю, агрегаторы документации запрещены только с REFRESH FAST
, так что в чем проблема?
ОБНОВЛЕНИЕ Ответы Vincents и Tonys были разными, но полезны. Я принял Тониса, но обязательно прочитайте также ответ Винсента.
Я бы посоветовал не хранить несколько значений («Twisty Tail; Candy Cane, Lucky Leaf») в одном столбце ... –