db2 - usuarios - que es ibm i
DB2 encuentra tablas que hacen referencia a mi tabla (2)
[db2-as400] Tengo una tabla ENR_DATA
que tiene la columna EnrollmentID
como clave principal. Esta columna es referida por muchas tablas como una "clave externa". ¿Hay alguna manera de enumerar todas las tablas que se refieren a EnrollmentID
de la tabla ENR_DATA
?
DB2 en IBM i (AS 400) ofrece una lista de todas las tablas del sistema, el catálogo del sistema . Es el lugar donde se almacenan los metadatos. Una de las vistas, SYSCST, es la vista con todas las restricciones , la vista SYSCSTCOL tiene información sobre las columnas de restricción, y SYSCSTDEP almacena las dependencias.
Entonces consultaría SYSCST, SYSCSTCOL y SYSCSTDEP para encontrar los detalles.
Hay algunas vistas de catálogo que dan solo una parte de la respuesta, y tiene que unirlas todas juntas.
- SYSCST proporciona una lista de restricciones con el tipo de restricción. Desde aquí podemos seleccionar restricciones de clave externa. TABLE_NAME en esta tabla es la tabla que contiene la clave externa.
- SYSKEYCST proporciona una lista de columnas para una clave externa, clave principal o restricción única dada junto con la posición ordinal de la columna en la clave y el nombre de la tabla asociada.
- SYSREFCST proporciona el nombre de la restricción Clave primaria o Única a la que hace referencia una Restricción de clave externa dada.
De estas tres tablas podemos escribir el siguiente SQL:
select cst.constraint_schema, cst.constraint_name,
fk.table_schema, fk.table_name, fk.ordinal_position, fk.column_name,
pk.table_schema, pk.table_name, pk.column_name
from qsys2.syscst cst
join qsys2.syskeycst fk
on fk.constraint_schema = cst.constraint_schema
and fk.constraint_name = cst.constraint_name
join qsys2.sysrefcst ref
on ref.constraint_schema = cst.constraint_schema
and ref.constraint_name = cst.constraint_name
join qsys2.syskeycst pk
on pk.constraint_schema = ref.unique_constraint_schema
and pk.constraint_name = ref.unique_constraint_name
where cst.constraint_type = ''FOREIGN KEY''
and fk.ordinal_position = pk.ordinal_position
and pk.table_name = ''ENR_DATA''
and pk.column_name = ''ENROLLMENTID''
order by cst.constraint_schema, cst.constraint_name;
Esto le dará los nombres de tabla que hacen referencia a ''ENR_DATA'' a través de una clave externa. Tenga en cuenta que tengo ENROLLMENTID en mayúsculas. Así es como DB2 for i almacena todos los nombres de columna a menos que se citen con "".