Oracle10g 将测试数据填充到oracle数据库
我有一个具有更复杂外键关系的oracle数据库模式。。我需要将测试数据填充到所有表中。。由于外键限制,我发现很难找到表的层次结构。。有人能提出实现这一目标的方案或方法吗Oracle10g 将测试数据填充到oracle数据库,oracle10g,Oracle10g,我有一个具有更复杂外键关系的oracle数据库模式。。我需要将测试数据填充到所有表中。。由于外键限制,我发现很难找到表的层次结构。。有人能提出实现这一目标的方案或方法吗 提前感谢如果您能让我们知道您希望输出采用什么形式,那将非常有用。你可能想从弗兰克·库拉什的开始来展示这条路 如果您正在寻找一种方法来确定加载表的顺序,这与a相同,因为DBA仍处于测试阶段,所以不能将此问题标记为重复问题。差不多 WITH constraint_tree AS ( SELECT DISTINCT
提前感谢如果您能让我们知道您希望输出采用什么形式,那将非常有用。你可能想从弗兰克·库拉什的开始来展示这条路 如果您正在寻找一种方法来确定加载表的顺序,这与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的所有表。如果表的层次结构非常复杂,并且如果您可以单独访问模式,即对用户施加一些停机时间,则可以禁用所有外键约束,加载数据,然后重新启用约束
另一种选择是使用可延迟的约束,并且仅在加载数据的会话中延迟它们;但是这样做也有缺点,一个是你必须首先删除所有的约束,如果它们还没有被删除的话,那么你可以将它们延迟。如果表的层次结构非常复杂,并且如果你可以单独访问模式,即给用户施加一些停机时间,你可以禁用所有外键约束,加载数据,然后重新启用约束 另一种选择是使用可延迟的约束,并且仅在加载数据的会话中延迟它们;但是这样做也有缺点,一个是你必须先去掉所有的限制,如果它们还没有被删除,那么你就可以推迟