Presentacion - Base de Datos II - Tratamiento de Errores
-
Upload
cristian-pinzon -
Category
Documents
-
view
224 -
download
0
Transcript of Presentacion - Base de Datos II - Tratamiento de Errores
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
1/27
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
2/27
Manejo de Errores con Begin Try/End Try Begin
Catch/End Catch
Uso de la variable @@Error
Lanzar Errores con la instruccin Raiserror
CONTENIDO
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
3/27
TRATAMIENTO DE ERORES
SQL Server proporciona el control de errores a
travs de las instrucciones TRY y CATCH.
Estas nuevas instrucciones suponen un gran pasoadelante en el control de errores en SQL Server.
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
4/27
TRATAMIENTO DE ERORES
Begin try
Expresion_sql
End try
Begin catch
Expresion_sql
End catch
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
5/27
TRATAMIENTO DE ERORES
Funciones especiales de Error
Las funciones especiales de error, estn disponibles
nicamente en el bloque CATCH para la obtencin de
informacin detallada del error.
A continuacin, presentamos las funciones que se utilizan
en el control de errores.
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
6/27
TRATAMIENTO DE ERORES
Funciones especiales de Error
ERROR_NUMBER(): Devuelve el numero de error
ERROR_SEVERITY(): Devuelve la severidad del error
ERROR_STATE(): Devuelve el estado del error ERROR_PROCEDURE(): Devuelve el nombre del
procedimiento almacenado que ha provocado el error
ERROR_LINE(): Devuelve el nmero de lnea en la que
se ha producido el error. ERROR_MESSAGE(): Devuelve el mensaje de error
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
7/27
TRATAMIENTO DE ERORES
Errores no afectados por una construccinTRYCATCHLas construcciones TRYCATCH no detectan lo siguiente:
o
Advertencias o mensajes informativos que tienen unagravedad 10 o inferior.
o Errores que tienen la gravedad 20 o superior que
detienen el procesamiento de las tareas de Motor de
base de datos de SQL Server en la sesin. Si se produce
un error con una gravedad 20 o superior y no seinterrumpe la conexin con la base de datos,
TRYCATCH controlar el error.
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
8/27
TRATAMIENTO DE ERORES
Errores no afectados por una construccin TRYCATCH
Las construcciones TRYCATCH no detectan lo siguiente:
o Atenciones, como solicitudes de interrupcin de clientes
o conexiones de cliente interrumpidas.o Cuando el administrador del sistema finaliza la sesin
mediante la instruccin KILL.
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
9/27
TRATAMIENTO DE ERORES
Errores no afectados por una construccin TRYCATCH
Un bloque CATCH no controla los siguientes tipos de
errores cuando se producen en el mismo nivel de ejecucin
que la construccin TRYCATCH:
Errores de compilacin, como errores de sintaxis, que
impiden la ejecucin de un lote.
Errores que se producen durante la recompilacin deinstrucciones, como errores de resolucin de nombres de
objeto que se producen despus de la compilacin
debido a una resolucin de nombres diferida.
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
10/27
PROBLEMAS PRCTICOS
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
11/27
--Problema N1--sin capturar el error Qu sucede?
DECLARE @DIVISORINT,@DIVIDENDOINT,
@RESULTADOINT
SET@DIVIDENDO=5
SET@DIVISOR=0
-- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR
0
SET@RESULTADO=@DIVIDENDO/@DIVISOR
Manejo de Errores con TRYCATCH
--Resultado de la EjecucinMens. 8134, Nivel 16, Estado 1, Lnea 6Error de divisin entre cero.
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
12/27
Manejo de Errores con TRYCATCH
--Resultado de la EjecucinSE HA PRODUCIDO UN ERROR
--Ahora capturando el error con Begin Try/End Try - Begin Catch/EndCatch
BEGINTRY
DECLARE @DIVISORINT,@DIVIDENDOINT,@RESULTADOINT
SET@DIVIDENDO=5
SET@DIVISOR=0
-- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0
SET@RESULTADO=@DIVIDENDO/@DIVISOR
PRINT'NO HAY ERROR'
ENDTRY
BEGINCATCH
PRINT'SE HA PRODUCIDO UN ERROR'ENDCATCH;
GO
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
13/27
Manejo de Errores con TRYCATCH
--Resultado de la EjecucinErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage
8134 16 1 NULL 8 Error de divisin entre cero.
BEGINTRY
DECLARE @DIVISORINT,@DIVIDENDOINT,@RESULTADOINT
SET@DIVIDENDO=100
SET@DIVISOR=0
-- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0
SET@RESULTADO=@DIVIDENDO/@DIVISOR
PRINT'NO HAY ERROR'
ENDTRY
BEGINCATCH
SELECT
ERROR_NUMBER()ASErrorNumber
,ERROR_SEVERITY()ASErrorSeverity
,ERROR_STATE()ASErrorState
,ERROR_PROCEDURE()ASErrorProcedure
,ERROR_LINE()ASErrorLine
,ERROR_MESSAGE()ASErrorMessage;
ENDCATCH
GO
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
14/27
Manejo de Errores con TRYCATCH
--Resultado de la EjecucinError de divisin entre cero.
1
BEGINTRY
DECLARE@DIVISORINT,@DIVIDENDOINT,@RESULTADOINTSET@DIVIDENDO=9
SET@DIVISOR=0
-- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0
SET@RESULTADO=@DIVIDENDO/@DIVISOR
PRINT'NO HAY ERROR'
ENDTRY
BEGINCATCH
PRINTERROR_MESSAGE()
PRINTERROR_STATE()
ENDCATCH;
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
15/27
TRATAMIENTO DE ERORES
Variable de sistema @@ERROR
Devuelve el nmero de error de la ltima
instruccin TRANSACT-SQL ejecutada; si lavariable devuelve 0, la TRANSACT-SQL anterior
no encontr errores.
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
16/27
TRATAMIENTO DE ERORES
Variable de sistema @@ERROR
La variable @@ERROR devuelve un nmero de error que
representa el error de la operacin. Si el error se encuentra
en la vista de catlogo sys.sysmessages, entonces@@ERROR, contendr el valor de la columna
sys.sysmessages.error para dicho error. Puede ver el texto
asociado con el nmero de error @@ERROR en
sys.sysmessages.description
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
17/27
Manejo de Errores con @@Error
--Resultado de la EjecucinMens. 547, Nivel 16, Estado 0, Lnea 1
Instruccin DELETE en conflicto con la restriccin REFERENCE
"FK_TB_Producto_TB_Proveedor_Codigo_Proveedor". El conflicto ha aparecido en la base
de datos "DB_EmpresaXYZ", tabla "dbo.TB_Producto", column 'Codigo_Proveedor'.
Se termin la instruccin.
No se puede eliminar el Proveedor indicado.
--Qu sucede con el manejo del error?DELETEFROMTB_Proveedor
IF@@ERROR0
BEGIN
PRINT'No se puede eliminar el Proveedor
indicado.'
END
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
18/27
Manejo de Errores con @@Error
--Resultado de la Ejecucin
(0 filas afectadas)
Proveedor con Registros enlazados.
547
BEGINTRY
DELETEFROMTB_Proveedor
ENDTRY
BEGINCATCH
declare@NERRORINT
SET@NERROR=@@ERROR
IF@NERROR=547
BEGIN
PRINT'Proveedor con Registros enlazados.'PRINT@NERROR
END
ENDCATCH
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
19/27
Manejo de Errores con @@Error
--Resultado de la Ejecucin(0 filas afectadas)
Ya existe un registro de estudiantes con esos datos.
2627
USEBD_ACADEMICA
GO
SELECT*FROMTB_ESTUDIANTES
BEGINTRY
INSERTINTOTB_ESTUDIANTES(ID_Estudiante,Nombre_Estudiante,Apellido_Estudiante,
Direccion_Estudiante,Telefono_Fijo_Estudiante,Telefono_Movil_Estudiante,
Correo_Estudiante,Cod_Carrera)
VALUES (9025,'Carlos','Perez','barbarena','993-1616','66302678',
'[email protected]',1001)ENDTRY
BEGINCATCH
declare@NERRORINT
SET@NERROR=@@ERROR
IF@NERROR0
BEGIN
PRINT'Ya existe un registro de estudiantes con esos datos.'
PRINT@NERROR
END
ENDCATCH
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
20/27
Manejo de Errores con @@Error
--Resultado de la Ejecucin(0 filas afectadas)
Instruccin %1! en conflicto con la restriccin %2! "%3!". El conflicto ha aparecido en la base de
datos "%4!", tabla "%5!"%6!%7!%8!.
547
USEDB_EmpresaXYZ
GOBEGINTRY
DELETEFROMTB_Producto--WHERE Cantidad_Inventario < 20
ENDTRY
BEGINCATCH
DECLARE@MENSAJEVARCHAR(255)
DECLARE@ErrorNumint
--Recuperar la Descripcin del error
SELECT@MENSAJE=M.description,@ErrorNum=M.error FROM
SYS.sysmessagesM
WHEREM.error=@@ERRORandmsglangid=3082
PRINT@MENSAJE
PRINT@ErrorNum
ENDCATCH
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
21/27
TRATAMIENTO DE ERORES
Generar un error RAISERROREn ocasiones, es necesario provocar voluntariamente un
error, por ejemplo nos puede interesar que se genere un
error cuando los datos incumplen una regla de negocio.
Podemos provocar un error en tiempo de ejecucin a travs
de la funcin RAISERROR.
La funcin RAISERROR recibe tres parmetros, el mensaje
del error (o cdigo de error predefinido), la severidad y elestado.
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
22/27
TRATAMIENTO DE ERORES
Generar un error RAISERROR
La severidad indica el grado de criticidad del error. Admite
valores de 0 al 25, pero solo podemos asignar valores del 0
al 18. Los errores el 20 al 25 son considerados fatales porel sistema, y cerraran la conexin que ejecuta el comando
RAISERROR.
Para asignar valores del 19 al 25, necesitaremos sermiembros de la funcin de SQL Server sysadmin.
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
23/27
Lanzar Mensaje de Error con RAISERROR
--Resultado de la EjecucinSin error en la ejecucin
Mens. 50000, Nivel 3, Estado 1
DECLARE@VALORINT
SET@VALOR=16IF@VALOR=15
BEGIN
RAISERROR('Un problema ha ocurrido al intentar
ejecutar la operacin
realizada',16,1 )
ENDELSE
BEGIN
RAISERROR('Sin error en la ejecucin',3,1 )
END
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
24/27
Lanzar Mensaje de Error con RAISERROR
--Resultado de la EjecucinMens 50000, Nivel 16, Estado 1, Procedimiento PROC_RAISERROR_REGISTRO_ESTUDIANTE, Lnea 22
Se requiere por lo menos el nombre y apellido del Estudiante
USEBD_ACADEMICA
GO
CREATEPROCEDUREPROC_RAISERROR_REGISTRO_ESTUDIANTE
@IdInt,@Nombrevarchar(20),
@Apellidovarchar(20),
@Direccionvarchar (20),
@Telefonovarchar(10),
@Movilvarchar(10),
@Correovarchar(50),
@Carreraint
AS
BEGIN
IF (@Nombre''and@Apellido'')BEGIN
INSERTINTOTB_ESTUDIANTES(ID_Estudiante,Nombre_Estudiante,Apellido_Estudiante,Direccion_Estudiante,
Telefono_Fijo_Estudiante,Telefono_Movil_Estudiante,Correo_Estudiante,Cod_Carrera)
VALUES(@Id,@Nombre,@Apellido,@Direccion,@Telefono,@Movil,@Correo,@Carrera)
END
ELSE
BEGIN
RAISERROR ('Se requiere por lo menos el nombre y apellido del Estudiante',16,1)
ENDEND
GO
--LLamar procedimiento almacenado.
EXECPROC_RAISERROR_REGISTRO_ESTUDIANTE9026,'','','barbarena','993-1616','66302678',
'[email protected]',1001
Go
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
25/27
PROBLEMAS PROPUESTOS
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
26/27
/*
PROBLEMA PROPUESTO N1. Escribir el cdigo SQL que permitaverificar si existe el registro de un docente con los datos de
entrada. Si el registro exste con el nombre y el apellido, se
genere un error indicando que ya existe un registro del docente
utilizando la instruccin RAISERROR
*/
/*
Escriba el cdigo SQL para lanzar una advertencia cuando para un
curso especificado no hallan cupos disponibles segn una cantidad
establecida. Cuando la cantidad es por debajo del umbral igual se
indica con un mensaje que hay cupos disponible.*/
PROBLEMAS PROPUESTOS
-
7/25/2019 Presentacion - Base de Datos II - Tratamiento de Errores
27/27
FIN DE LA SESIN