Escenario:
Está trabajando como DBA o desarrollador de SQL Server. Debe eliminar una tabla de una base de datos. Cuando ejecuta la declaración SchemaName.TableName de la tabla desplegable, obtiene el siguiente error.Mensaje 3726, Nivel 16, Estado 1, Línea 12
No se pudo eliminar el objeto 'SchemaName.TableName' porque es referenciado por una restricción FOREIGN KEY.
Ahora sabemos que la restricción de clave externa hace referencia a la tabla. El problema es cómo encontrar qué tabla tiene esa restricción de clave externa que hace referencia a esta tabla.
Solución:
1) Hay muchas formas de obtener esta información. Podemos usar las vistas del sistema para encontrar el nombre de la tabla que tiene la restricción de clave externa que hace referencia a nuestra tabla principal.SELECT Schema_Name(Schema_id) as TableSchemaName, object_name(FK.parent_object_id) ParentTableName, object_name(FK.referenced_object_id) ReferenceTableName FROM sys.foreign_keys AS FK WHERE object_name(FK.referenced_object_id)='YourTableName' and Schema_Name(Schema_id)='YourTableSchemaName'
Ejecuté el script anterior para mi tabla de clientes que está presente en el esquema dbo y esto es lo que obtuve.
Cómo encontrar la clave externa de la tabla que hace referencia a la tabla en SQL Server. |
Ahora sabemos que Ord es la tabla que tiene la restricción de clave externa que hace referencia a nuestra tabla. Podemos continuar y eliminar la restricción de clave externa y luego eliminar nuestra tabla.
2) Usar el procedimiento almacenado del sistema sp_fkeys
Podemos usar el procedimiento almacenado del sistema para obtener la información de restricciones de clave externa que hace referencia a nuestra tabla. Si el nombre de mi tabla es Cliente, puedo ejecutar el script como se muestra a continuación
EXEC sp_fkeys 'Customer'
Cómo obtener el nombre de restricción de clave externa para una tabla en SQL Server |
sp_fkeys devuelve información muy detallada, algunas de las columnas no se muestran en la instantánea anterior. aquí está la lista de columnas que devolverá.
- PKTABLE_QUALIFIER
- PKTABLE_OWNER
- PKTABLE_NAME
- PKCOLUMN_NAME
- FKTABLE_QUALIFIER
- PROPIETARIO_FKTABLE
- FKTABLE_NAME
- FKCOLUMN_NAME
- KEY_SEQ
- ACTUALIZAR_REGLA
- ELIMINAR_REGLA
- FK_NAME
- PK_NAME
Video de demostración:No se pudo soltar el objeto porque hace referencia a una restricción de clave externa