Hola, chicos,
¡Buen día!
Introducción
En esta publicación, le demostraré cómo identificar, eliminar y recrear claves externas (FK) de una tabla en SQL Server. Muchas veces necesitamos eliminar una tabla o simplemente cambiar una columna, pero la base de datos nos envía un mensaje de error informándonos que existe una restricción de clave externa para esa columna, imposibilitando que el DBA realice el cambio solicitado.
Mensaje 5074, Nivel 16, Estado 1, Línea 57
El objeto 'PK__Clientes__3214EC07F3BD01EC' depende de la columna 'Id'.
Mensaje 5074, Nivel 16, Estado 1, Línea 57
El objeto 'FK_Cliente_Telefone' depende de la columna 'Id'.
Mensaje 5074, Nivel 16, Estado 1, Línea 57
El objeto 'FK_Cliente_Endereco' depende de la columna 'Id'.
Mensaje 4922, Nivel 16, Estado 9, Línea 57
ALTER TABLE ALTER COLUMN El ID falló porque uno o más objetos acceden a esta columna.
Para resolver este problema, debe eliminar las restricciones FK, realizar el cambio en la tabla y luego crearla nuevamente. Cuando la tabla tiene muchas referencias, esta tarea se vuelve un poco laboriosa, especialmente si se trata de varias tablas.
Para facilitar esta actividad, que es muy común en la vida cotidiana, decidí crear y poner a su disposición un procedimiento almacenado que verifica los FK en las vistas del catálogo de SQL Server y trae la lista completa.
Importante: Debido a restricciones técnicas, SQL Server le permite crear claves externas solo entre objetos de la misma base de datos.
Creando la masa de prueba
Para demostrar el uso de este procedimiento, creé este script simple para que puedas generar una gran cantidad de pruebas y probar el SP.
IF (OBJECT_ID('dbo.Clientes') IS NOT NULL) DROP TABLE dbo.Clientes
CREATE TABLE dbo.Clientes (
Id INT IDENTITY(1,1) PRIMARY KEY,
Nome VARCHAR(50)
)
INSERT INTO dbo.Clientes
SELECT 'Dirceu'
UNION ALL
SELECT 'Patricia'
UNION ALL
SELECT 'Lucas'
UNION ALL
SELECT 'Leandro'
UNION ALL
SELECT 'Richardson'
IF (OBJECT_ID('dbo.Enderecos') IS NOT NULL) DROP TABLE dbo.Enderecos
CREATE TABLE dbo.Enderecos (
Id INT IDENTITY(1,1) PRIMARY KEY,
Id_Cliente INT,
Ds_Endereco VARCHAR(50)
)
ALTER TABLE dbo.Enderecos ADD CONSTRAINT FK_Cliente_Endereco FOREIGN KEY (Id_Cliente) REFERENCES dbo.Clientes(Id)
INSERT INTO dbo.Enderecos (Id_Cliente, Ds_Endereco)
SELECT 1, 'Endereço Teste Cliente 1'
UNION ALL
SELECT 2, 'Endereço Teste Cliente 2'
UNION ALL
SELECT 3, 'Endereço Teste Cliente 3'
IF (OBJECT_ID('tempdb..dbo.Telefones') IS NOT NULL) DROP TABLE dbo.Telefones
CREATE TABLE dbo.Telefones (
Id INT IDENTITY(1,1) PRIMARY KEY,
Id_Cliente INT,
Nr_Telefone VARCHAR(11)
)
ALTER TABLE dbo.Telefones ADD CONSTRAINT FK_Cliente_Telefone FOREIGN KEY (Id_Cliente) REFERENCES dbo.Clientes(Id)
INSERT INTO dbo.Telefones (Id_Cliente, Nr_Telefone)
SELECT 1, '27999998888'
UNION ALL
SELECT 4, '27999997777'
UNION ALL
SELECT 5, '27999996666'
IF (OBJECT_ID('dbo.Teste1') IS NOT NULL) DROP TABLE dbo.Teste1
CREATE TABLE dbo.Teste1 (
Cod1 INT NOT NULL,
Cod2 int NOT NULL,
Cod3 int NOT NULL,
Nome VARCHAR(200)
)
IF (OBJECT_ID('dbo.Teste2') IS NOT NULL) DROP TABLE dbo.Teste2
CREATE TABLE dbo.Teste2 (
Codigo1 INT NOT NULL,
Codigo2 int NOT NULL,
Codigo3 int NOT NULL,
Nome VARCHAR(200)
)
ALTER TABLE dbo.Teste2 ADD CONSTRAINT [PK_Teste2] PRIMARY KEY (Codigo1, Codigo2, Codigo3)
ALTER TABLE dbo.Teste1 ADD CONSTRAINT [FK_Teste1] FOREIGN KEY (Cod1, Cod2, Cod3) REFERENCES dbo.Teste2(Codigo1, Codigo2, Codigo3)
Comentários (0)
Carregando comentários…