A veces es interesante crear excepciones personalizadas en una base de datos para que se disparen cuando realicemos una acción que no queramos permitir. Para explicarlo, propongo el siguiente ejemplo:
01 create database BDExcepciones
02 GO
03 use BDExcepciones
04 GO
05 create table Coches
06 (
07 id int identity primary key,
08 marca varchar(20),
09 descripcion varchar(100),
10 matricula varchar(20)
11 )
12 GO
Introducimos unos datos en la tabla
01 insert into Coches (marca, descripcion, matricula)
02 VALUES ('Mercedes', 'El Coche del Roman Azul Cielo', 'NOTEPEGA');
03 insert into Coches (marca, descripcion, matricula)
04 VALUES ('Opel Corsa', 'El corsita', 'PALABODA');
05 insert into Coches (marca, descripcion, matricula)
06 VALUES ('Rover 25', 'A ver lo que dura', 'ROTO');
07 insert into Coches (marca, descripcion, matricula)
08 VALUES ('Ford Focus', 'El coche nuevo', 'COCHENUEVO');
Creamos excepciones.Los identificadores deben ser a partir del 50001 y la severidad debe ser 16 para que se trate como una excepción. Siempre hay que definir el mensaje en ingles y luego en español.
01 use master go
02 sp_addmessage 50002, 11, 'Ya existe un coche con esa matricula', 'us_english';
03 go
04 sp_addmessage 50002, 11, 'Ya existe un coche con esa matricula', 'spanish';
05 go
06 sp_addmessage 50003, 16, 'Ya existe un coche con esa matricula', 'us_english';
07 go
08 sp_addmessage 50003, 16, 'Ya existe un coche con esa matricula', 'spanish';
09 go
10 use BDExcepciones go
Para lanzarla usaremos: RAISERROR (50002, 11, 1). Creamos un procedimiento que inserta un coche y si su matricula existe nos devuelve una excepcion.
01 ALTER PROCEDURE InsertarCoche
02 @marca varchar(20),
03 @descripcion varchar(100),
04 @matricula varchar(20) AS
05 BEGIN
06 SELECT * FROM Coches WHERE matricula = @matricula
07 if @@ROWCOUNT = 0
08 BEGIN
09 INSERT INTO Coches (marca, descripcion, matricula) VALUES (@marca, @descripcion, @matricula);
10 END
11 ELSE
12 BEGIN
13 RAISERROR (50002, 11, 1)
14 END
15 END;
16 -- lo probamos
17 execute InsertarCoche 'cochenuevo', 'para cuando', 'ROTO';
Ahora vamos a hacer el mismo ejemplo pero en el trigger antes de insertar.
01 ALTER PROCEDURE InsertarCoche
02 @marca varchar(20),
03 @descripcion varchar(100),
04 @matricula varchar(20) AS
05 BEGIN
06 SELECT * FROM Coches WHERE matricula = @matricula
07 if @@ROWCOUNT = 0
08 BEGIN
09 INSERT INTO Coches (marca, descripcion, matricula) VALUES (@marca, @descripcion, @matricula);
10 END
11 ELSE
12 BEGIN
13 RAISERROR (50002, 11, 1)
14 END
15 END;
16 -- lo probamos
17 execute InsertarCoche 'cochenuevo', 'para cuando', 'ROTO';
Aunque personalmente, a estas alturas prefiero usar la base de datos tan solo como almacén de datos, y delegar a la capa de negocio toda la programación que de otra forma iría en ella, puede que en algún momento nos sea de utilidad.
No hay comentarios:
Publicar un comentario