viernes, 17 de mayo de 2013

Ejemplo de uso de exepciones personalizadas en SQL Server

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