2013-07-18 2 views
0

Я хотел бы определить отношения внешних ключей между несколькими таблицами. Учитывая имя таблицы и имя столбца, как я могу определить, какие другие таблицы имеют отношение внешнего ключа к этому столбцу?Oracle: Программный способ определения зависимостей внешнего ключа?

(table name, column name) -> (list of tables,columns with FK dependency) 
+1

[ALL_CONSTRAINTS] (http://docs.oracle.com/cd/E11882_01/server.112/e25513/statviews_1046. htm # i1576022) [ALL_CONS_COLUMNS] (http://docs.oracle.com/cd/E11882_01/server.112/e25513/statviews_1044.htm#i1575870) –

+0

Есть способы запросить словарь данных, чтобы найти определенные ограничения FK, так как другие будут предлагать. Однако следует отметить, что некоторые приложения могут не определять ограничения FK и вместо этого полагаться на приложение для обеспечения целостности базы данных. Например, собственный E-Business Suite от Oracle не использует ограничения FK в базе данных среди тысяч таблиц. – Wolf

+0

@JohnDoyle, я не думаю, что это дублированный вопрос. Этот вопрос требует более узкого круга ключей, основанных на таблице и столбце. Указанный вопрос показывает, как получить все отношения FK в схеме. Похоже, но не совсем то же самое. –

ответ

0

Вы могли бы сделать что-то вроде этого, возможно:

select x.owner || '.' || x.table_name || '.' || x.column_name childcol, 
     y.owner || '.' || y.table_name || '.' || y.column_name parentcol, 
     z.constraint_name 
    from all_cons_columns x, 
     all_cons_columns y, 
     all_constraints z 
where x.constraint_name = z.constraint_name 
    and z.owner = x.owner 
    and y.constraint_name = z.r_constraint_name 
    and z.constraint_type = 'R' 

Вы также должны были бы включить в предикате ли таблица вы ищете является родителем или ребенок в отношении внешнего ключа.

0

Я использую этот запрос для сравнения столбцов, на которые ссылаются внешние ключи, потому что наши администраторы баз данных требуют, чтобы они были того же типа и той же точности. Может быть, это может вам помочь.

Вы можете использовать префиксы DBA, ALL или USER в зависимости от прав доступа:

SELECT uc.constraint_name,ucc1.TABLE_NAME,ucc1.column_name,a.data_type||'('||nvl(a.data_precision,a.data_length)||')' length, 
     ucc2.TABLE_NAME references_table,ucc2.column_name references_column, b.data_type||'('||nvl(b.data_precision,b.data_length)||')' length 
FROM  user_constraints uc 
,  user_cons_columns ucc1 
,  user_cons_columns ucc2 
,  user_tab_columns a 
,  user_tab_columns b 
WHERE uc.constraint_name = ucc1.constraint_name 
and  a.column_name=ucc1.column_name 
and  b.column_name=ucc1.column_name 
and  uc.table_name=a.table_name 
and  uc.table_name=b.table_name 
AND  uc.r_constraint_name = ucc2.constraint_name 
AND  ucc1.POSITION = ucc2.POSITION 
AND  uc.constraint_type = 'R' 
ORDER BY ucc1.TABLE_NAME 
,  uc.constraint_name; 
Смежные вопросы