Errores en SQL Server. ¿Cómo gestionarlos?

Estoy creando un website dinámico con Dreamweaver MX, lenguaje ASP VBScript, SQL 2000 Server y PWS como servidor de prueba. El site no está todavía en la red.
De momento ya tengo creadas las opciones y páginas principales. Casi todas las acciones que lleva a cabo el site con la base de datos lo hace con procedimientos almacenados en SQL Server que yo mismo he ido creando con la ayuda de manuales y foros de discusión. Estos procedimientos me funcionan bien, así como las diferentes páginas del site, pero he oído hablar mucho de que hay que saber capturar los errores que me pueda devolver SQL Server y evitar que mi sitio se caiga. ¿Alguien podría explicarme de que va todo esto?.
No entiendo por qué tengo que saber capturar estos errores que, si llegaran a ocurrir, devolvería el mensaje de error en el navegador y el usuario intentaría otra vez la operación y listos, como he visto en muchos sites. Después tendría que averiguar yo por qué se dan estos errores y solucionarlo, o pedir ayuda a un administrador web experto :-). ¿O puedo yo evitar o minimizar esos errores de alguna forma?.
Tampoco entiendo por qué pueden llegar a darme errores los procedimientos almacenados, ahora me funcionan perfectamente. Si por ejemplo se introduce un e-mail que no existe en la BD, he programado en la página para que me dirija a otra página de error informando al usuario que el e-mail es incorrecto.
Gracias,
Ejemplo de un procedimiento almacenado de los que tengo:
CREATE PROCEDURE comprobar_mail_password_inscripcion
@Correo_electronico varchar(50), @Password char(10),
@Oferta_num int, @Data datetime, @Motivos_interes varchar(250)
As
Declare @Demandante_num int
If Exists(select Correo_electronico from Demandantes where Correo_electronico = @Correo_electronico
and Password = @Password)
begin
select @Demandante_num = Demandante_num
from Demandantes
where Correo_electronico = @Correo_electronico
and Password = @Password
select @Demandante_num AS Demandante_num, 1 AS Valor
INSERT INTO Inscripciones_en_ofertas (Oferta_num, Demandante_num, Data, Motivos_interes)
VALUES (@Oferta_num, @Demandante_num, @Data, @Motivos_interes)
end
else
begin
select 0 AS Valor
end

2 respuestas

Respuesta
1
Creo que siempre que puedas realizar casi cualquier operación en una BBDD, tienes la posibilidad, aunque a ti te parezca remota, de que ésta obtenga un error.
Para controlar los errores en Sql-Server, debieras vigilar la variable del sistema @@error. En cuanto ésta es distinta de 0, es que ha habido algún error. ¿Dónde debieras preguntar por su valor? Pues justamente después de todas aquellas instrucciones de acceso a tablas, actualizaciones, borrados y sobre todo, transacciones que son susceptibles de fallar. Por ejemplo, en tu procedimiento, estaría muy bien, si después de tu INSERT INTO Inscripciones_en_ofertas (Oferta_num, Demandante_num, Data, Motivos_interes)
VALUES (@Oferta_num, @Demandante_num, @Data, @Motivos_interes), tuvieras una instrucción que preguntara por esta variable, de la siguiente manera:
if (@@error <> 0)
PRINT "Error en la inserción"
Porque aunque pienses que tu procedimiento no puede fallar, lo más probable es que alguna vez, por lo que sea, falle. ¿Y si tienes algún tipo de constraint, alguna primary key que violas? Para eso está el uso y consulta de esta variable del sistema.
Junto a ella, hay una serie de mensajes de error del sistema, en master.dbo.sysmessages e incluso podrás definirlos tú mismo con el procedimiento sp_addmessage.
Todos los errores deberán tener un número de error único, una cadena de mensaje de error que ofrezca información de qué es lo que ha pasado, un nivel de gravedad, un código de estado, un nombre del procedimiento donde se pudo producir el error y un número de línea.
Cada error tendrá distintos niveles de gravedad, desde mensajes meramente informativos hasta mensajes de error de hardware o integridad de la BBDD.
Así mismo, existe otra función que es el RaiseError más destinado al tratamiento de errores que el print que antes escribí, que es válido para devolver mensajes a las aplicaciones. De esta manera, tu mensaje podrá ser recogido en tu aplicación ASP y ser mostrado al usuario si conviene, o mostrarse en tiempo de debug al desarrollador.
Respuesta
1
Puede utilizar las transacciones, begin transaction, rollback transaction, commit, tambien puedes utilizar la variable @@error, que si es distinta de 0 entonces hubo un error y puedes hacer un rollback, amigo mio, nunca te confies de tus proc almac, ya que en cualquier minuto pueden fallar, si tienes mas dudas no dudes en preguntarme
Ok, tengo un manual donde explica un poco las cuatro herramientas principales de SQL Server para manejar errores, son: La declaración RETURN, el procedimiento almacenado sp_addmessage, la declaración RAISERROR y la función @@ERROR.
¿Evita muchos errores utilizar estas herramientas? ¿De qué sirve utilizarlas? ¿Puedes ponerme un ejemplo con mi procedimiento almacenado para hacerlo mucho más fiable y así aplico la estructura a todos mis demás sp?
CREATE PROCEDURE comprobar_mail_password_inscripcion
@Correo_electronico varchar(50), @Password char(10),
@Oferta_num int, @Data datetime, @Motivos_interes varchar(250)
As
Declare @Demandante_num int
If Exists(select Correo_electronico from Demandantes where Correo_electronico = @Correo_electronico
and Password = @Password)
begin
select @Demandante_num = Demandante_num
from Demandantes
where Correo_electronico = @Correo_electronico
and Password = @Password
select @Demandante_num AS Demandante_num, 1 AS Valor
INSERT INTO Inscripciones_en_ofertas (Oferta_num, Demandante_num, Data, Motivos_interes)
VALUES (@Oferta_num, @Demandante_num, @Data, @Motivos_interes)
end
else
begin
select 0 AS Valor
end
¿Referente a los? ¿Transaction Logs? El manual que tengo explica muy brevemente y sin ejemplos para que sirven. Dice que en SQL Server hay dos tipos de transacciones, las explícitas y las implícitas, ¿y entiendo que como existen las implícitas no hace falta poner los? ¿Transaction Logs? (begin transaction, rollback transaction, commit transaction, commit work). ¿Es así?
Si claro!, tómate el tiempo que necesites, me gustan las cosas bien pensadas.
Con respecto a tu pregunta si es así, con respecto a tu sp, más tarde podría agregarle todo lo que te digo, ya que no tengo mucho tiempo ahora, así que ojala me tengas un poquito de paciencia.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas