¿Cómo puedo enumerar todas las claves externas que hacen referencia a una tabla determinada en SQL Server?
Necesito eliminar una tabla con muchas referencias en una base de datos de SQL Server. ¿Cómo puedo obtener una lista de todas las restricciones de clave externa que tendré que eliminar para eliminar la tabla?
(Es preferible responder SQL a hacer clic en la GUI del estudio de administración).
No estoy seguro de por qué nadie sugirió, pero lo uso sp_fkeys
para consultar claves externas para una tabla determinada:
EXEC sp_fkeys 'TableName'
También puede especificar el esquema:
EXEC sp_fkeys @pktable_name = 'TableName', @pktable_owner = 'dbo'
Sin especificar el esquema, los documentos establecen lo siguiente:
Si no se especifica pktable_owner, se aplican las reglas de visibilidad de tabla predeterminadas del DBMS subyacente.
En SQL Server, si el usuario actual posee una tabla con el nombre especificado, se devuelven las columnas de esa tabla. Si no se especifica pktable_owner y el usuario actual no posee una tabla con el pktable_name especificado, el procedimiento busca una tabla con el pktable_name especificado propiedad del propietario de la base de datos. Si existe uno, se devuelven las columnas de esa tabla.
Esto te da:
- El propio FK
- Esquema al que pertenece el FK
- La " tabla de referencia " o la tabla que tiene el FK
- La " columna de referencia " o la columna dentro de la tabla de referencia que apunta al FK
- La " tabla referenciada " o la tabla que tiene la columna clave a la que apunta su FK
- La " columna referenciada " o la columna que es la clave a la que apunta su FK
Código a continuación:
SELECT obj.name AS FK_NAME,
sch.name AS [schema_name],
tab1.name AS [table],
col1.name AS [column],
tab2.name AS [referenced_table],
col2.name AS [referenced_column]
FROM sys.foreign_key_columns fkc
INNER JOIN sys.objects obj
ON obj.object_id = fkc.constraint_object_id
INNER JOIN sys.tables tab1
ON tab1.object_id = fkc.parent_object_id
INNER JOIN sys.schemas sch
ON tab1.schema_id = sch.schema_id
INNER JOIN sys.columns col1
ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
INNER JOIN sys.tables tab2
ON tab2.object_id = fkc.referenced_object_id
INNER JOIN sys.columns col2
ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id
Usaría la función Diagramación de bases de datos en SQL Server Management Studio, pero como usted la descartó, esto funcionó para mí en SQL Server 2008 (no tengo 2005).
Para obtener una lista de nombres de tablas y columnas de referencia...
select
t.name as TableWithForeignKey,
fk.constraint_column_id as FK_PartNo, c.
name as ForeignKeyColumn
from
sys.foreign_key_columns as fk
inner join
sys.tables as t on fk.parent_object_id = t.object_id
inner join
sys.columns as c on fk.parent_object_id = c.object_id and fk.parent_column_id = c.column_id
where
fk.referenced_object_id = (select object_id
from sys.tables
where name = 'TableOthersForeignKeyInto')
order by
TableWithForeignKey, FK_PartNo
Para obtener nombres de restricciones de clave externa
select distinct name from sys.objects where object_id in
( select fk.constraint_object_id from sys.foreign_key_columns as fk
where fk.referenced_object_id =
(select object_id from sys.tables where name = 'TableOthersForeignKeyInto')
)
Prueba esto :
sp_help 'TableName'