Oracle10g 将测试数据填充到oracle数据库

Oracle10g 将测试数据填充到oracle数据库,oracle10g,Oracle10g,我有一个具有更复杂外键关系的oracle数据库模式。。我需要将测试数据填充到所有表中。。由于外键限制,我发现很难找到表的层次结构。。有人能提出实现这一目标的方案或方法吗 提前感谢如果您能让我们知道您希望输出采用什么形式,那将非常有用。你可能想从弗兰克·库拉什的开始来展示这条路 如果您正在寻找一种方法来确定加载表的顺序,这与a相同,因为DBA仍处于测试阶段,所以不能将此问题标记为重复问题。差不多 WITH constraint_tree AS ( SELECT DISTINCT

我有一个具有更复杂外键关系的oracle数据库模式。。我需要将测试数据填充到所有表中。。由于外键限制,我发现很难找到表的层次结构。。有人能提出实现这一目标的方案或方法吗


提前感谢

如果您能让我们知道您希望输出采用什么形式,那将非常有用。你可能想从弗兰克·库拉什的开始来展示这条路

如果您正在寻找一种方法来确定加载表的顺序,这与a相同,因为DBA仍处于测试阶段,所以不能将此问题标记为重复问题。差不多

WITH    constraint_tree AS
(
    SELECT DISTINCT
        a.table_name    AS table_name
    ,   b.table_name    AS parent_table_name
    FROM        dba_constraints a
    LEFT OUTER JOIN dba_constraints b
    ON      a.r_constraint_name = b.constraint_name
    AND     a.owner         = b.owner
    WHERE       a.owner = 'SCOTT'
)
SELECT table_name, lvl
  FROM (
    SELECT a.*,
           rank() over (partition by table_name order by lvl desc) rnk
      FROM (
        SELECT  table_name, level lvl
          FROM  constraint_tree
         START WITH parent_table_name   IS NULL
       CONNECT BY NOCYCLE parent_table_name = PRIOR table_name
      ) a 
    ) b
 WHERE rnk = 1
 ORDER BY lvl, table_name
/

假设数据中没有循环,将按加载顺序为您提供表。如果要并行加载,可以同时加载具有相同LVL的所有表。

如果您能让我们知道您希望输出采用什么形式,那将非常有用。你可能想从弗兰克·库拉什的开始来展示这条路

如果您正在寻找一种方法来确定加载表的顺序,这与a相同,因为DBA仍处于测试阶段,所以不能将此问题标记为重复问题。差不多

WITH    constraint_tree AS
(
    SELECT DISTINCT
        a.table_name    AS table_name
    ,   b.table_name    AS parent_table_name
    FROM        dba_constraints a
    LEFT OUTER JOIN dba_constraints b
    ON      a.r_constraint_name = b.constraint_name
    AND     a.owner         = b.owner
    WHERE       a.owner = 'SCOTT'
)
SELECT table_name, lvl
  FROM (
    SELECT a.*,
           rank() over (partition by table_name order by lvl desc) rnk
      FROM (
        SELECT  table_name, level lvl
          FROM  constraint_tree
         START WITH parent_table_name   IS NULL
       CONNECT BY NOCYCLE parent_table_name = PRIOR table_name
      ) a 
    ) b
 WHERE rnk = 1
 ORDER BY lvl, table_name
/

假设数据中没有循环,将按加载顺序为您提供表。如果要并行加载,可以同时加载具有相同LVL的所有表。

如果表的层次结构非常复杂,并且如果您可以单独访问模式,即对用户施加一些停机时间,则可以禁用所有外键约束,加载数据,然后重新启用约束


另一种选择是使用可延迟的约束,并且仅在加载数据的会话中延迟它们;但是这样做也有缺点,一个是你必须首先删除所有的约束,如果它们还没有被删除的话,那么你可以将它们延迟。

如果表的层次结构非常复杂,并且如果你可以单独访问模式,即给用户施加一些停机时间,你可以禁用所有外键约束,加载数据,然后重新启用约束

另一种选择是使用可延迟的约束,并且仅在加载数据的会话中延迟它们;但是这样做也有缺点,一个是你必须先去掉所有的限制,如果它们还没有被删除,那么你就可以推迟