válida una truncar tipos tabla restricción restricciones restriccion referencial referencia quitar puede objeto integridad hay hace foreign externa ella datos clave check sql sql-server sql-server-2008

una - restricciones sql



¿Cómo puedo averiguar qué restricción FOREIGN KEY hace referencia a una tabla en SQL Server? (14)

Intento dejar caer una tabla pero recibir el siguiente mensaje:

Msg 3726, nivel 16, estado 1, línea 3
No se pudo eliminar el objeto ''dbo.UserProfile'' porque está referenciado por una restricción FOREIGN KEY.
Msg 2714, nivel 16, estado 6, línea 2
Ya hay un objeto llamado ''UserProfile'' en la base de datos.

Miré a mi alrededor con SQL Server Management Studio pero no puedo encontrar la restricción. ¿Cómo puedo averiguar las restricciones de clave externa?


--Los siguientes pueden darle más de lo que está buscando:

create Procedure spShowRelationShips ( @Table varchar(250) = null, @RelatedTable varchar(250) = null ) as begin if @Table is null and @RelatedTable is null select object_name(k.constraint_object_id) ForeginKeyName, object_name(k.Parent_Object_id) TableName, object_name(k.referenced_object_id) RelatedTable, c.Name RelatedColumnName, object_name(rc.object_id) + ''.'' + rc.name RelatedKeyField from sys.foreign_key_columns k left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id order by 2,3 if @Table is not null and @RelatedTable is null select object_name(k.constraint_object_id) ForeginKeyName, object_name(k.Parent_Object_id) TableName, object_name(k.referenced_object_id) RelatedTable, c.Name RelatedColumnName, object_name(rc.object_id) + ''.'' + rc.name RelatedKeyField from sys.foreign_key_columns k left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id where object_name(k.Parent_Object_id) =@Table order by 2,3 if @Table is null and @RelatedTable is not null select object_name(k.constraint_object_id) ForeginKeyName, object_name(k.Parent_Object_id) TableName, object_name(k.referenced_object_id) RelatedTable, c.Name RelatedColumnName, object_name(rc.object_id) + ''.'' + rc.name RelatedKeyField from sys.foreign_key_columns k left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id where object_name(k.referenced_object_id) =@RelatedTable order by 2,3 end


Aquí está:

SELECT OBJECT_NAME(f.parent_object_id) TableName, COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id INNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id WHERE OBJECT_NAME (f.referenced_object_id) = ''YourTableName''

De esta manera, obtendrá la tabla de referencia y el nombre de la columna.

Editado para usar sys.tables en lugar de sys.objects genéricos según sugerencia de comentario. Gracias, marc_s


En SQL Server Management Studio puede hacer clic derecho en la tabla en el explorador de objetos y seleccionar "Ver dependencias". Esto te daría un buen punto de partida. Muestra tablas, vistas y procedimientos que hacen referencia a la tabla.


Encontré esta respuesta bastante simple e hice el truco para lo que necesitaba: https://.com/a/12956348/652519

Un resumen del enlace, use esta consulta:

EXEC sp_fkeys ''TableName''

Rápido y simple. Pude localizar rápidamente todas las tablas de claves externas, columnas respectivas y nombres de claves externas de 15 tablas.

Como se menciona a continuación en @mdisibio, aquí hay un enlace a la documentación que detalla los diferentes parámetros que se pueden usar: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-fkeys-transact-sql


Esta es la mejor manera de descubrir la relación de clave foránea en toda la base de datos.

exec sp_helpconstraint ''Table Name''

y una manera más

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME=''Table Name'' --and left(CONSTRAINT_NAME,2)=''FK''(If you want single key)


Estoy usando esta secuencia de comandos para encontrar todos los detalles relacionados con la clave externa. Estoy usando INFORMATION.SCHEMA. Debajo hay una secuencia de comandos SQL:

SELECT ccu.table_name AS SourceTable ,ccu.constraint_name AS SourceConstraint ,ccu.column_name AS SourceColumn ,kcu.table_name AS TargetTable ,kcu.column_name AS TargetColumn FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc ON ccu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON kcu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME ORDER BY ccu.table_name


La forma más fácil de obtener Primary Key y Foreign Key para una tabla es:

/* Get primary key and foreign key for a table */ USE DatabaseName; SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_NAME LIKE ''PK%'' AND TABLE_NAME = ''TableName'' SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_NAME LIKE ''FK%'' AND TABLE_NAME = ''TableName''


Otra forma es verificar los resultados de

sp_help ''TableName''

(o simplemente resalte el nombre de tabla citado y presione ALT + F1)

Con el tiempo, decidí refinar mi respuesta. A continuación se muestra una captura de pantalla de los resultados que sp_help ofrece. A ha utilizado la BD AdventureWorksDW2012 para este ejemplo. Hay mucha información buena allí, y lo que estamos buscando está al final - resaltado en verde:


Prueba esto

SELECT object_name(parent_object_id) ParentTableName, object_name(referenced_object_id) RefTableName, name FROM sys.foreign_keys WHERE parent_object_id = object_id(''Tablename'')


Puede usar esta consulta para mostrar Foreign key constantes de las Foreign key foráneas:

SELECT K_Table = FK.TABLE_NAME, FK_Column = CU.COLUMN_NAME, PK_Table = PK.TABLE_NAME, PK_Column = PT.COLUMN_NAME, Constraint_Name = C.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME INNER JOIN ( SELECT i1.TABLE_NAME, i2.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME WHERE i1.CONSTRAINT_TYPE = ''PRIMARY KEY'' ) PT ON PT.TABLE_NAME = PK.TABLE_NAME ---- optional: ORDER BY 1,2,3,4 WHERE PK.TABLE_NAME=''YourTable''

Tomado de http://blog.sqlauthority.com/2006/11/01/sql-server-query-to-display-foreign-key-relationships-and-name-of-the-constraint-for-each-table-in-database/


También puede devolver toda la información sobre las Foreign Keys foráneas al adaptar la respuesta de @LittleSweetSeas:

SELECT OBJECT_NAME(f.parent_object_id) ConsTable, OBJECT_NAME (f.referenced_object_id) refTable, COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id INNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id order by ConsTable


prueba la siguiente consulta.

select object_name(sfc.constraint_object_id) AS constraint_name, OBJECT_Name(parent_object_id) AS table_name , ac1.name as table_column_name, OBJECT_name(referenced_object_id) as reference_table_name, ac2.name as reference_column_name from sys.foreign_key_columns sfc join sys.all_columns ac1 on (ac1.object_id=sfc.parent_object_id and ac1.column_id=sfc.parent_column_id) join sys.all_columns ac2 on (ac2.object_id=sfc.referenced_object_id and ac2.column_id=sfc.referenced_column_id) where sfc.parent_object_id=OBJECT_ID(<main table name>);

esto dará el constraint_name, column_names que se referirán y las tablas que dependerán de la restricción estarán allí.


si desea acceder a través de SSMS en la ventana del explorador de objetos, haga clic con el botón derecho en el objeto que desea eliminar, y ver las dependencias.


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;