Translate

lunes, 16 de septiembre de 2013

Creando un sitio web ASP .Net. Parte 4



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