martes, 24 de noviembre de 2020

Desactivar llaves foráneas

En algunos casos, sobre todo en bases de datos de prueba, es necesario desactivar las restricciones de alguna tabla para poder realizar algunas pruebas, y, aunque las restricciones nos sirven precisamente para guardar la integridad de la información, habrá algunos casos especiales en que necesitemos brincarnos la protección.



La pregunta siguiente que nos pudiéramos hacer sería ¿necesito borrar las restricciones mediante el comando DROP en las tablas?, pues la respuesta llanamente sería que si, definitivamente es una manera de hacerlo, pero no la más optima pues es el camino más largo, otra opción es con las restricciones de la tabla on delete cascade, pero también serías mas tardada, aquí les mostraré la manera de desactivar temporalmente las restricciones de llaves foráneas.

Voy a suponer en este post, que ya se tiene conocimiento de las llaves foráneas, de lo contrario pueden entrar en el siguiente enlace Relaciones entre tablas.

Pero vamos a entrar en materia y hacer la práctica, que es lo que nos gusta y como aprendemos.

Primeramente comenzaremos por crear en caso de que no este creada, la base de datos, posteriormente crearemos tres tablas, una de usuarios, otra de categorías y otra de post, simulando un blog. Llenaremos rápidamente las tablas y trataremos de borrar información de alguna tabla con restricciones.


Creando base de datos, tablas y datos

CREATE DATABASE PRUEBAS

GO


use PRUEBAS

go

CREATE TABLE USUARIOS(

user_id int primary key identity,

nombre varchar(max))

 

CREATE TABLE CATEGORIAS(

categoria_id int primary key identity,

nombre varchar(max))

 

CREATE TABLE POSTS(

post_id int primary key identity,

user_id int,

categoria_id int,

titulo varchar(200),

contenido varchar(max))

 

ALTER TABLE POSTS ADD constraint user_id FOREIGN KEY (user_id) references USUARIOS (user_id)

ALTER TABLE POSTS ADD constraint categoria_id FOREIGN KEY (categoria_id) references CATEGORIAS (categoria_id)

 

insert into USUARIOS (nombre) values ('Emmanuel Urias')

GO

insert into CATEGORIAS (nombre) values ('SQL_SERVER')

GO

INSERT INTO POSTS (user_id, categoria_id, titulo, contenido) values (1,1,'DESACTIVAR 

FK', 'CONTENIDO DEL POST');


Borrando información de tablas con restricción


Como vemos, la tabla de post depende de la tabla de categorías, y de usuarios, de forma que si queremos borrar la tabla usuarios o la tabla de categorías, no nos permitirá debido a la restricción, pero veamos el ejemplo.

USE PRUEBAS

GO

delete from CATEGORIAS

Al ejecutar el script vemos que obtenemos el siguiente error:

Msg 547, Level 16, State 0, Line 3

The DELETE statement conflicted with the REFERENCE constraint "categoria_id". The conflict occurred in database "PRUEBAS", table "dbo.POSTS", column 'categoria_id'.

The statement has been terminated.


No se puede eliminar la tabla, debido a que existen post apuntando a esa categoría, por lo cual, vamos a proceder a desactivar las llaves foráneas de la tabla de POST, pues de esa tabla depende el ejercicio.

alter table dbo.POSTS NOCHECK constraint ALL --Desactivar

delete from CATEGORIAS


(1 row(s) affected)


De esta manera ya se borro el dato de la tabla de CATEGORIAS, deshabilitando temporalmente las llaves foráneas.

CUIDADO: Esto provocará datos huérfanos, hay que tener en cuenta que en la base de datos habrá inconsistencias en la información

Una vez que realizamos nuestro cometido, es importante volver a habilitar las llaves foráneas mediante el siguiente comando:

alter table dbo.POSTS CHECK constraint ALL --Activar

Hasta aquí el post, espero que haya sido de su agrado y de utilidad, espero compartan, comenten, pregunten o den clic a algún anuncio de su interes. 

Saludos


Referencia



No hay comentarios.:

Publicar un comentario

Tablas temporales en SQL SERVER

Buenas noches queridos lectores, el día de hoy veremos un tema útil acerca de las tablas temporales. Las tablas temporales, son tablas que s...