Oracle SQL在模式

时间:2016-04-29 19:22:40

标签: sql oracle hierarchy database-administration

我需要根据密钥从多个表格和架构中导入一些给定输入的数据。

For-Ex:我有ACCOUNT_ID COLUMN,这是多个表共有的(表与FK相互依赖)。我想从多个模式的所有表中导入特定帐户的数据,并生成SQL脚本。

但挑战是,我需要首先识别父表,然后再按顺序识别他们的子表(与FK并列),这样当我运行脚本时,它不应该错误输出完整性违规错误。

一种方法是禁用所有约束,生成脚本,运行然后启用约束。

但我试图找出是否有更好的方法来做到这一点。启用/禁用约束可能不适合我。

感谢对此问题的任何意见。

1 个答案:

答案 0 :(得分:0)

您说您的表基于外键创建层次结构,因此例如T1引用T2,T2引用T3等。
在这种情况下,您需要分层查询。

首先创建一个显示表之间引用的视图:

select c.table_name, uc.table_name as referenced_table_name 
from user_constraints c
join USER_CONS_columns uc ON c.r_constraint_name = uc.constraint_name
where c.constraint_type = 'R'

例如在这种情况下:

CREATE TABLE ttt1(
   ACCOUNT_ID int primary key,
   somecolumn varchar2(100)
);

CREATE TABLE ttt21(
   id int primary key,
   ACCOUNT_ID int referencing ttt1( ACCOUNT_ID ),
   somecolumn varchar2(100)
);

CREATE TABLE ttt22(
   id int primary key,
   ACCOUNT_ID int referencing ttt1( ACCOUNT_ID ),
   somecolumn varchar2(100)
);

CREATE TABLE ttt211(
   id int primary key,
   ACCOUNT_ID int referencing ttt21( id ),
   somecolumn varchar2(100)
);

CREATE TABLE ttt2111(
   id int primary key,
   ACCOUNT_ID int referencing ttt211( id ),
   somecolumn varchar2(100)
);

CREATE TABLE ttt2112(
   id int primary key,
   ACCOUNT_ID int referencing ttt211( id ),
   somecolumn varchar2(100)
);

视图给出:

TABLE_NAME REFERENCED_TABLE_NAME   
---------- -------------------------
TTT22      TTT1                     
TTT211     TTT21                    
TTT21      TTT1                     
TTT2111    TTT211                   
TTT2112    TTT211

现在,借助此视图,您可以创建分层查询:

WITH my_view AS( 
    select c.table_name, uc.table_name as referenced_table_name 
    from user_constraints c
    join USER_CONS_columns uc ON c.r_constraint_name = uc.constraint_name
    where c.constraint_type = 'R'
) SELECT level, m.referenced_table_name  
FROM my_view m
START WITH referenced_table_name not in (select table_name from my_view )
CONNECT BY prior table_name = referenced_table_name;

给出以下输出:

     LEVEL REFERENCED_TABLE_NAME   
---------- -------------------------                    
         1 TTT1                     
         2 TTT21                    
         3 TTT211                   
         3 TTT211                   
         1 TTT1 

LEVEL列给出了必须导入表的顺序 - 首先需要处理级别1的所有表,然后处理级别2,依此类推等等。