2009-07-23 37 views
17

Heredé un esquema, por lo que no tengo conocimiento completo/confianza en lo que hay allí.Oracle todas las referencias de clave externa

Tengo una tabla de proyecto con un projectId. Hay muchas otras tablas que hacen referencia a esta tabla por identificación del proyecto. Lo que quiero hacer es ejecutar una consulta para establecer:

  1. Qué tablas tienen referencias de clave externa a la tabla de proyectos en el ID de proyecto
  2. Qué tablas tienen una columna llamada Identificación del proyecto (en claves externas de casos no están configurados).

Si se trataba de SQL Server sé cómo consultar los metadatos, pero ¿cómo puedo hacer esto en Oracle?

Respuesta

22

1)

select table_name 
    from all_constraints 
where r_constraint_name = [your pk/uk constraint on PROJECTS(id)] 

2)

select table_name 
    from all_tab_columns 
where column_name = 'PROJECT_ID' 

Es posible que desee agregar un predicado adicional que contenga la columna PROPIETARIO.

Saludos, Rob. No parecían

1

1): SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME='R' and R_CONSTRAINT_NAME='xxx'

donde xxx es el nombre de la restricción de clave principal en la tabla de proyecto

2): SELECT * FROM USER_TAB_COLUMNS WHERE COLUMN_NAME='PROJECT_ID'

+1

Las restricciones de clave externa pueden potencialmente cruzar esquemas, por lo que no iría por las restricciones de usuario. Idem para la user_tab_columns. –

+0

Rob: Realmente depende. En mi entorno, el usuario _... es suficiente, all_tab_columns daría resultados engañosos. –

+1

ammoQ: cierto, depende. usuario _... podría ser suficiente. Pero vea el título del hilo: "TODAS las referencias de llaves extranjeras" ... –

0

Los r_constraint_name respuestas aquí a trabajar para mí, sin saber por qué, ya que soy nuevo en Oracle a mí mismo, pero esto funcionó:

SELECT * FROM ALL_CONSTRAINTS WHERE CONSTRAINT_NAME = '<constraint>'; 
18

Ok. Aquí una solicitud que le dan la tabla de referencia y la columna:

SELECT 
c_list.CONSTRAINT_NAME as NAME, 
substr(c_src.COLUMN_NAME, 1, 20) as SRC_COLUMN, 
c_dest.TABLE_NAME as DEST_TABLE, 
substr(c_dest.COLUMN_NAME, 1, 20) as DEST_COLUMN 
FROM ALL_CONSTRAINTS c_list, ALL_CONS_COLUMNS c_src, ALL_CONS_COLUMNS c_dest 
WHERE c_list.CONSTRAINT_NAME = c_src.CONSTRAINT_NAME 
AND c_list.OWNER    = c_src.OWNER 
AND c_list.R_CONSTRAINT_NAME = c_dest.CONSTRAINT_NAME 
AND c_list.OWNER    = c_dest.OWNER 
AND c_list.CONSTRAINT_TYPE = 'R' 
AND c_src.OWNER  = '<your-schema-here>' 
AND c_src.TABLE_NAME = '<your-table-here>' 
GROUP BY c_list.CONSTRAINT_NAME, c_src.TABLE_NAME, 
    c_src.COLUMN_NAME, c_dest.TABLE_NAME, c_dest.COLUMN_NAME; 

que le dan algo como esto:

NAME     |SRC_COLUMN  |DEST_TABLE   | DEST_COLUMN 
----------------------|----------------|----------------------|----------- 
CFK_RUB_FOR   |FOR_URN   |T03_FORMAT   |FOR_URN 
CFK_RUB_RUB   |RUB_RUB_URN  |T01_RUBRIQUE   |RUB_URN 
CFK_RUB_SUP   |SUP_URN   |T01_SUPPORT   |SUP_URN 
CFK_RUB_PRD   |PRD_URN   |T05_PRODUIT   |PRD_URN 

usted puede olvidarse la función substr() si el resultado es utilizable sin. Este no es mi caso.

0

Mi problema era un poco diferente. Tengo una tabla y quería saber programáticamente qué otras tablas/columnas hace referencia.

empecé con la respuesta de Stan anterior, pero esto no me dio exactamente lo que necesitaba, así que se le ocurrió esto, que he puesto aquí por si alguien más tiene mi problema:

WITH src as 
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position, ac.r_constraint_name 
    FROM ALL_CONSTRAINTS ac, all_cons_columns accs 
WHERE ac.owner = '<owner>' 
    AND ac.constraint_type = 'R' 
    AND ac.table_name = '<src_table>' 
    AND accs.owner = ac.owner 
    AND accs.table_name = ac.table_name 
    AND accs.constraint_name = ac.constraint_name 
ORDER BY ac.table_name, ac.constraint_name, accs.position), 
dst as 
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position 
    FROM ALL_CONSTRAINTS ac, all_cons_columns accs 
WHERE ac.owner = '<owner>' 
    AND accs.owner = ac.owner 
    AND accs.table_name = ac.table_name 
    AND accs.constraint_name = ac.constraint_name 
ORDER BY ac.table_name, ac.constraint_name, accs.position) 
SELECT src.table_name as src_table, 
     dst.table_name as dst_table, 
     src.constraint_name as src_constraint, 
     src.column_name as src_column, 
     dst.column_name as dst_column, 
     src.position as position 
    FROM src,dst 
WHERE src.r_constraint_name = dst.constraint_name 
    AND src.position = dst.position 
0

Utilice esta consulta.

select b.TABLE_NAME,b.CONSTRAINT_NAME ,a.COLUMN_NAME 
    from all_constraints b, all_cons_columns a 
    where r_constraint_name = 'Constraint_Name' and a.CONSTRAINT_NAME=b.CONSTRAINT_NAME; 
Cuestiones relacionadas