Roque
Rueda
Mi hermano me solicito que le creara un sitio web para
venta de ropa así que para apoyarle he decidido crear un sitio web ASP .net en
donde el pueda promocionar las ventas.
En el post pasado se
definió una función para el manejo de expresiones regulares en SQLServer 2008
R-2, ahora vamos a utilizar dicha función para crear restricciones "constraints"
en nuestra base de datos para asegurar que los datos almacenados sean los
correctos.
Para esto en nuestra
tabla Client vamos a agregar
restricciones de datos en las columnas Email,
Name, LastName, MotherName, City para esto recordemos la estructura hasta
el momento de nuestra tabla.
Vamos a abrir una
nueva ventana de consultas en SQLServer Management Studio para crear las
restricciones y agregarlas a la tabla. Para este caso la tabla ya hasido creada
con anterioridad por lo que vamos a alterar su estructura para que contenga la
restriccion.
Como se imaginaran el
comando a utilizar en este caso es el comando alter.
-- Ejemplo
ALTER TABLE Some_Table ADD CONSTRAINT Constraint_Name
CHECK (expression >
1);
Vamos para esto a
utilizar nuestra función que creamos en el post anterior con lo que tendremos
algo como lo siguiente:
ALTER TABLE Client ADD CONSTRAINT CK_Email_Format
CHECK ([dbo].[RegExp](Email,
'^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$') = 1);
Una vez que ejecutamos
el comando vamos a ver en nuestra tabla nuevos constraints (tal vez hay que
volver a cargar "refresh").
Ahora podemos
comprobar el funcionamiento de nuestra restriccion al intentar agregar un nuevo
elemento en la tabla.
INSERT INTO Client (Email,Name,LastName,MotherName,Stree,City,State,Zip,Country)
VALUES ('skaroque@gmail.com', 'Roque', 'Rueda', 'Anastacio', 'Calle 6630 671 33 33',
'Canaca', 'DF', '', 'Republica Mexicana')
Al ejecutarlo
tendremos que se inserto un registro:
Para visualizar los
datos ejecutamos una selección sobre la tabla.
SELECT * FROM
Client
Como se puede observar
se inserto un nuevo dato. Ahora que pasa si insertamos un dato con un valor que
no es válido en la tabla.
INSERT INTO Client (Email,Name,LastName,MotherName,Stree,City,State,Zip,Country)
VALUES ('correo_eletronico.com@', 'Thom', 'Yorke',
'Radiohead', 'Calle 10',
'London', 'Zacatecas', '01123', 'UK')
En este caso el
resultado de esta operación es un erro que es lo que deseamos, yo no quiero que
se agregue ningún correo electrónico que no cumpla con el formato.
Ahora vamos a
seleccionar todas aquellas restricciones que deseamos y vamos crear un gran
script conteniendo todas las que necesitemos. Si necesitamos eliminar alguno de
nuestros constraints necesitamos ejecutar el siguiente comando:
-- ALTER TABLE Client DROP CONSTRAINT
CK_Email_Format
En este caso quiero
agregar una restriccion para el codigo postal para que solo admita codigos
postales que se componen de 5 digitos. Para poder lograr esto vamos a ejecutar
el siguiente comando:
ALTER TABLE Client ADD CONSTRAINT CK_Zip
CHECK (Zip LIKE '[0-9][0-9][0-9][0-9][0-9]')
Y vamos a obtener el
siguiente resultado:
Msg 547, Level 16, State 0, Line 1
The ALTER TABLE statement conflicted with the CHECK
constraint "CK_Zip". The conflict occurred in database
"LuisClothes", table "dbo.Client", column 'Zip'.
Esto es debido a que cuando
se crea la restricción esta evalúa el contenido ya existente en la tabla, en
este caso ya que no tengo más que datos de prueba voy a proceder a eliminar los
datos de la tabla y crear de nuevo, en caso de que tengamos ya datos y estos no
se puedan borrar lo mejor sería crear una tabla temporal la cual se inserte los
datos y posteriormente se regresen los valores.
DELETE FROM Client;
ALTER TABLE Client ADD CONSTRAINT CK_Zip
CHECK (Zip LIKE '[0-9][0-9][0-9][0-9][0-9]');
Command(s)
completed successfully.
De este modo vamos a
lograr que el comando se ejecute sin errores. Y de momento eso será las
restricciones que quiero para mi tabla de clientes. Ahora vamos a pasar con la
tabla de ventas:
Para esta tabla voy a
iniciar con la restricción de que el total debe ser mayor a 0. Ya que esta
tabla tiene una restricción foreing key
de nuestro email del cliente no es necesario que agreguemos algún check, ya que si no existe el email en
la tabla de clientes este no va a poder ser utilizado en nuestra tabla de
ventas, y como está ya contiene la restricción vamos a estar bien.
-- Ejemplo
--ALTER TABLE Some_Table ADD CONSTRAINT Constraint_Name
--CHECK (expression > 1);
ALTER TABLE Client ADD CONSTRAINT CK_Email_Format
CHECK ([dbo].[RegExp](Email,
'^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$') = 1);
INSERT INTO Client (Email,Name,LastName,MotherName,Stree,City,State,Zip,Country)
VALUES ('skaroque@gmail.com', 'Roque', 'Rueda', 'Anastacio', 'Calle 6630 671 33 33',
'Canaca', 'DF', '', 'Republica Mexicana');
SELECT * FROM Client;
INSERT INTO Client (Email,Name,LastName,MotherName,Stree,City,State,Zip,Country)
VALUES ('correo_eletronico.com@', 'Thom', 'Yorke',
'Radiohead', 'Calle 10',
'London', 'Zacatecas', '01123', 'UK');
-- ALTER TABLE Client DROP CONSTRAINT CK_Email_Format
DELETE FROM Client;
ALTER TABLE Client ADD CONSTRAINT CK_Zip
CHECK (Zip LIKE '[0-9][0-9][0-9][0-9][0-9]');
ALTER TABLE Sales ADD CONSTRAINT CK_Total_Positive
CHECK (Total > 0);
ALTER TABLE SalesDetail ADD
CONSTRAINT CK_Price_Positive
CHECK (Price > 0);
ALTER TABLE Product ADD CONSTRAINT CK_Price_Product_Positive
CHECK (Price >
0);
Además se agregaron
algunas otras restricciones similares ahora lo que sigue es la creación de
procedimientos almacenados y funciones que sean necesarias en nuestra base de
datos; ¿por qué vamos a generar funciones y procedimientos almacenados? en este
caso deseamos que la base de datos tenga la funcionalidad mínima para asegurar
que las operaciones que se realicen en la base de datos sean las adecuadas.
Además prefiero que la base de datos se encargue de las funciones
transaccionales y la forma de agregar los datos dentro de cada tabla.
No hay comentarios:
Publicar un comentario