oracle数据库数据从一个相对表同步到多个相对表

oracle数据库数据从一个相对表同步到多个相对表,oracle,Oracle,我有一个用户表,非常简单 create table user ( user_id int primary key, user_name varchar2(20) ) 我构建了一对与用户表关联的相对表,每个表都有一个user\u id,user\u name。 所以这里有一个问题,我碰巧用错误的名称输入了一个数据,但是我只是用所有相关的表链接到了这个错误的记录。如果我想更正user表,并在所有相关表中同步user\u name。我如何以简单的方式执行?另外,我

我有一个用户表,非常简单

    create table user (
     user_id int primary key,
     user_name varchar2(20)
    )
我构建了一对与用户表关联的相对表,每个表都有一个
user\u id
user\u name
。 所以这里有一个问题,我碰巧用错误的名称输入了一个数据,但是我只是用所有相关的表链接到了这个错误的记录。如果我想更正
user
表,并在所有相关表中同步
user\u name
。我如何以简单的方式执行?另外,我没有对这些表设置任何约束

编辑:

让我说得更清楚些。我可以从
user
表中查询所有用户,然后在jsp页面中创建一个
select
。这个选择器得到两个字段
user\u id
user\u name
。这就是我们所说的选择器。首先,我用'01'记录了一个男人,可能是'tam',我只是在
salary
中用'tam'记录了另一行,'1300美元'。这一切都错了,因为我的名字叫“汤姆”。更改
用户
薪资
很容易,但在我们的系统中,有40多个表链接到
用户
。我知道这是个坏主意,但它就是这样设计的
通过我们的dba,它已经运行了很长时间。

我们将从明确问题开始。数据模型违反:不是依赖
user\u id
引用
user\u name
而是依赖于
user
表的每个表都具有该属性。这样做的结果是,更正
user\u 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;
/    
性能没有保证,因为它取决于每个表的数据和索引


“它已经运行了很长时间”


这让我想知道有多少数据不一致包含在您的系统中,您不知道?也许您的DBA需要复习他们的数据建模技能

我们将从明确问题开始。数据模型违反:不是依赖
user\u id
引用
user\u name
而是依赖于
user
表的每个表都具有该属性。这样做的结果是,更正
user\u 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;
/    
性能没有保证,因为它取决于每个表的数据和索引


“它已经运行了很长时间”


这让我想知道有多少数据不一致包含在您的系统中,您不知道?也许您的DBA需要复习他们的数据建模技能

Quote:“每个表都有一个用户名”。这就是问题所在。相关的表应该只引用主键。例如,列
user\u id
@MarmiteBomber是的,你是对的,这绝对是错误的设计。不幸的是,结构就在那里,我无法更改。当你说“我没有对这些表设置任何约束”时,你的意思是没有定义外键吗?您是如何在所有这些相关表上链接
用户名的?@APC我在java程序中使用该表,我们设计了一个用户选择器,可以从表中查询所有用户。所以这不是问题。@APC我的意思是链接
用户名
没有问题,因为我有一个选择器。真正的问题是当
用户名
发生变化时,例如,说我有一个'salary'表已经有一个'tam'链接到
用户
表,但真正的名称是'tom',所以这是一个问题,因为可能有30,40个表需要更新。这就是问题所在。相关的表应该只引用主键。例如,列
user\u id
@MarmiteBomber是的,你是对的,这绝对是错误的设计。不幸的是,结构就在那里,我无法更改。当你说“我没有对这些表设置任何约束”时,你的意思是没有定义外键吗?您是如何在所有这些相关表上链接
用户名的?@APC我在java程序中使用该表,我们设计了一个用户选择器,可以从表中查询所有用户。所以这不是问题。@APC我的意思是链接
用户名
没有问题,因为我有一个选择器。真正的问题是当
用户名
发生变化时,例如,说我有一个'salary'表已经有一个'tam'链接到
用户
表,但真正的名称是'tom',所以这是一个问题,因为可能有30,40个表需要更新。