Начнем с того, что сделаем проблему явной. Модель данных нарушает Третья нормальная форма : вместо того, чтобы ссылаться на 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;
/
Нет гарантий по производительности, потому что это зависит от данных и индексации для каждой таблицы.
"это уже давно работает"
Что заставляет меня задуматься о том, сколько несоответствий данных содержится в вашей системе, о которых вы не знаете? Возможно, вашему администратору баз данных необходимо освежить свои навыки моделирования данных.