данные базы данных оракула синхронизированы из одной в несколько относительных таблиц - PullRequest
0 голосов
/ 11 мая 2018

У меня есть пользовательская таблица, которая довольно проста

    create table user (
     user_id int primary key,
     user_name varchar2(20)
    )

И я строю пары относительных таблиц, связанных с пользовательской таблицей, и у каждой таблицы есть user_id, user_name. Итак, возникает вопрос: я неправильно ввел данные с неправильным именем, но потом я просто связал эту неправильную запись со всеми относительными таблицами. Если я хочу исправить таблицу user и синхронизировать user_name в одно и то же время во всех относительных таблицах. Как мне это сделать простым способом? Кроме того, я не устанавливал никаких ограничений для этих таблиц.

Edit:

Итак, позвольте мне выразить это более четко. Я могу запросить всех пользователей из таблицы user, а затем я просто создаю select на странице jsp. И этот селектор получил два поля user_id, user_name. Вот как мы называем это селектором. Сначала я записал человека с «01», может быть, «там», и я только что записал еще одну строку в salary с «там», «1300 $». Это было все неправильно, потому что имя было "Том". Это легко изменить user или salary, но в нашей системе более 40 таблиц связаны с user. Я знаю, что это плохая идея, но она разработана таким образом по нашему дба и он уже давно работал.

1 Ответ

0 голосов
/ 11 мая 2018

Начнем с того, что сделаем проблему явной. Модель данных нарушает Третья нормальная форма : вместо того, чтобы ссылаться на user_id для ссылки на user_name, каждая таблица, зависящая от таблицы user, имеет атрибут. Следствием этого является то, что исправление ошибки в user_name означает распространение этого изменения на каждую таблицу.

Более того, кажется, что в этом приложении отсутствует механизм исправления ошибок или, скорее, распространения исправления на все затронутые таблицы. Так что делать?

Динамический SQL и словарь данных на помощь:

declare
    l_id user.user_id%type := 1234;
    l_old_name user.user_name%type := 'Tam';
    l_new_name user.user_name%type := 'Tom';

begin
    for rec in ( select table_name from user_tab_cols where column_name = 'USER_ID'
                 intersect
                 select table_name from user_tab_cols where column_name = 'USER_NAME'
                 )
    loop
        execute immediate 'update '|| rec.table_name ||
                 ' set user_name = :1 where user_id = :2 and user_name = :3'
                 using l_new_name, l_id, l_old_name;
        commit;
    end loop;
end;
/    

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


"это уже давно работает"

Что заставляет меня задуматься о том, сколько несоответствий данных содержится в вашей системе, о которых вы не знаете? Возможно, вашему администратору баз данных необходимо освежить свои навыки моделирования данных.

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