linesize - Oracle todas las referencias de clave externa
sqlplus set lines (6)
He heredado un esquema, así que no tengo conocimiento / confianza completos en lo que hay.
Tengo una tabla de proyectos con un ID de proyecto. Hay un montón de otras tablas que hacen referencia a esta tabla por el ID del proyecto. Lo que quiero hacer es ejecutar una consulta para establecer:
- ¿Qué tablas tienen referencias de clave externa a la tabla de proyecto en el ID de proyecto?
- Qué tablas tienen una columna llamada ID de proyecto (en caso de que no se configuren las claves externas).
Si era SQL Server, sé cómo consultar los metadatos, pero ¿cómo hago esto en Oracle?
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.
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 del proyecto
2): SELECT * FROM USER_TAB_COLUMNS WHERE COLUMN_NAME=''PROJECT_ID''
De acuerdo. Aquí una solicitud que le da la tabla y la columna de referencia:
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 te 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
Puede olvidar la función substr () si el resultado es utilizable sin. Este no es mi caso.
Las respuestas de r_constraint_name
aquí no parecieron funcionar para mí, no estoy seguro de por qué soy nuevo en Oracle, pero esto funcionó:
SELECT * FROM ALL_CONSTRAINTS WHERE CONSTRAINT_NAME = ''<constraint>'';
Mi problema fue ligeramente diferente. Tengo una tabla y quería saber de manera programática a qué otras tablas / columnas hace referencia.
Comencé con la respuesta de Stan anterior, pero esto no me dio exactamente lo que necesitaba, por lo que se me ocurrió esto, que publico aquí en caso de que alguien más tenga 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
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;