¿Cómo puedo enumerar todas las claves externas que hacen referencia a una tabla determinada en SQL Server?

Resuelto chillitom asked hace 15 años • 32 respuestas

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).

chillitom avatar Jan 27 '09 19:01 chillitom
Aceptado

No estoy seguro de por qué nadie sugirió, pero lo uso sp_fkeyspara 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.

Recep avatar Oct 18 '2012 13:10 Recep

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
Gustavo Rubio avatar Sep 21 '2013 07:09 Gustavo Rubio

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')
)
Gishu avatar Jan 27 '2009 12:01 Gishu

Prueba esto :

sp_help 'TableName'
BankZ avatar Jan 27 '2009 12:01 BankZ