[SQL 2008] Manipulación de Errores MS SQL Server 2008.


Saludos amigos, nuevamente les dejo un tema que traduje y aprendí, para el manejo de Errores en SQL Server 2008, considero es muy bueno y que será para algunos la opción perfecta a utilizar en nuestras aplicaciones de bases de datos.

Mensajes de Error definidos por el Sistema y definidos por el Usuario.

Este tema se refiere a la visualización de errores definidos por el sistema y la agregación de mensajes de error definidos por el usuario a la instancia de SQL Server.

La tabla sys.messages contiene una fila por cada mensaje de error definido por el usuario y mensajes integrados en la instancia de SQL Server.

Los mensajes de error integrados son aquellos que se plantearon en respuesta a los errores estándar de SQL Server.

Los mensajes de error definidos por el usuario se utilizan comúnmente en aplicaciones de terceros (third-party applications), que definen un conjunto de mensajes de error para usarse dentro de una aplicación. Los mensajes de error definidos por el usuario permiten la parametrización, lo que significa que puede crear sus propios mensajes, los cuales permitirán una personalización basada en parámetros.

Visualizando la Información de Error del Sistema.

Para esto puede utilizar la vista del catalogo de sistema sys.messages para ver todos los mensajes de error del sistema y los definidos por el usuario en la instancia de SQL Server, como se muestra a continuación.

SELECT m.message_id, m.severity, m.is_event_logged, m.[text]
FROM sys.messages m
INNER JOIN sys.syslanguages l ON m.language_id = l.msglangid 
WHERE l.alias = 'Spanish'
ORDER BY m.severity DESC, m.[text]

En la consulta anterior solo se mostraran los mensajes del lenguaje Español, el resultado filtrado para fines de ejemplo seria el siguiente:

image

Explicando la tabla:

  • message_id: Identificador del mensaje.
  • severity: Nivel de gravedad.
  • is_event_logged: Se usa si el error se escribe en el registro de eventos de Windows.
  • text: Texto del mensaje.

Los rangos de nivel de gravedad “Severity” son de 1 a 25, con las siguientes categorizaciones implícitas:

0 al 10: Solo son mensajes informativos.

11 al 16: Son errores de motor de base de datos que pueden ser corregidos por el usuario, como son los objetos de la base de datos que faltan cuando se ejecuta la consulta, sugerencias de bloqueo no compatibles, permisos denegados, bloqueos de transacción y errores de sintaxis. Por ejemplo, una violación de llave primaria “PRIMARY KEY” devolverá un error de nivel de gravedad 14. Un error de división entre cero devuelve un error de nivel de gravedad 16.

17 al 19: Son errores que necesitan ser atendidos por el sysadmin, por ejemplo, si SQL Server se ha quedado sin recursos de memoria, o si se han alcanzado los límites del motor de base de datos.

20 al 25: Son errores fatales y de problemas del sistema, como los son hardware o software dañado que afecta a la base de datos, problemas de integridad y errores de los medios de comunicación.

Como pudieron  notar la columna de texto en sys.messages contiene el mensaje de error real que se presenta al usuario desde el motor de base de datos. Observe que algunos mensajes tienen signos de porcentaje y otros símbolos combinados dentro de ellos:

image

El signo % es un parámetro de sustitución que permite al motor de base de datos personalizar la salida del mensaje de error basado en el contexto actual de la base de datos y error de evento. Los valores concatenados para el signo % indican el tipo de dato y la longitud del parámetro de sustitución.

Creación de un mensaje de error definido por el usuario.

Para crear un nuevo mensaje de error definido por el usuario se hace utilizando el procedimiento almacenado de sistema sp_addmessage, tal vez desee crear sus propios mensajes de error personalizados para sus aplicaciones, y a si garantizar la coherencia a través de rutinas para el manejo de errores específicos de aplicación.

Para crear un nuevo mensaje de error y agregarlo a la vista de sistema sys.messages, tendremos que ejecutar el siguiente procedimiento almacenado “sp_addmessage”, para que posteriormente lo invoquemos con el comando RAISERROR().

Sintaxis:

sp_addmessage [ @msgnum = ] msg_id ,

[ @severity = ] severity ,

[ @msgtext = ] ‘msg’

[ , [ @lang = ] ‘language’ ]

[ , [ @with_log = ] ‘with_log’ ]

[ , [ @replace = ] ‘replace’ ]

Descripción de los parámetros:

msg_id: Es el identificador del error proporcionado por el usuario, que puede ser entre 50,001 y 2,147,483,647. El ID del mensaje no es de la clave única o llave primaría de la tabla; en su lugar, la clave única esta compuesta por la combinación del ID del mensaje y el ID de idioma.

  • severity: Define el nivel de gravedad del mensaje (1 a 25).
  • msg: Representa el mensaje de error real, que utiliza un tipo de datos nvarchar(255).
  • language: Especifica el idioma en el que está escrito el mensaje de error.
  • with_log: Esto define si el mensaje se escribirá o no en el Registro de errores de aplicación para Windows cuando se invoque el error.
  • Replace: Cuando se especifica,  El existente error definido por el usuario (basado en ID del mensaje y el lenguaje) es sobrescrito con los nuevos parámetros pasados al procedimiento almacenado del sistema.

Ahora crearemos nuestro propio mensaje de error definido por el usuario:

Nota importante: En mi caso estoy trabajando sobre un servidor configurado con Español (Spanish), y al intentar crear un mensajes de Error, me sale el siguiente mensaje de error:

image

Para esto debemos primero crear una versión de nuestro mensaje de error para el lenguaje Ingles (English), esto es por que el lenguaje nativo de SQL Server es el Ingles.

Ahora si creemos nuestro mensaje de error:

  • Creando el mensaje en Ingles:
-- Creando un mensaje de error en Ingles.
EXEC sp_addmessage  
70003,
14,
N'You dont have permission in the current table %s contact the database administrator.', 'English'
GO
  • Creando el mensaje en Español:
-- Creando un mensaje de error en Español.
EXEC sp_addmessage 
70003,
14,
N'No tiene permisos en la tabla actual %1! contacte al administrador de base de datos.', 'Spanish'
GO
  • Invocando los mensajes de error con RAISERROR():

-- Usando el mensaje creado con el comando RAISERROR.
-- Ingles
SET LANGUAGE us_english;
RAISERROR (70003, 14, 1, N'dbo.DEMO_ROLES')

-- Español
SET LANGUAGE Español;
RAISERROR (70003, 14, 1, N'dbo.DEMO_ROLES')

Resultado:

image

Por último vale la pena mencionar que para crear los parámetros en versiones no inglesas, deben utilizar números seguidos del signo de exclamación “!” que coincidan con los parámetros del mensaje original como lo muestro en el siguiente ejemplo:

image

Casi lo olvido, falta indicar como eliminar un mensaje de error, esto se realiza con la siguiente sintaxis:

sp_dropmessage [ @msgnum = ] message_number

[ , [ @lang = ] ‘language’ ]

Ejemplo:

EXEC sp_dropmessage 70003

Espero se de ayuda para ustedes, por favor dejen comentarios y apóyenme votando por mi blog.

 

votaPorMiBlogIvan Apóyame votando aquí: http://blogit.ms/TopBloggers.aspx en la categoría SQL Server. Los pasos para votar están aquí te llevara 3 min: Clic Aquí.

About these ads
    • Guillermo
    • 28/09/10

    Exelente, muy bueno no sabia que se podia hacer todo esto, felicidades espero que sigas aportando tus conocimientos.

  1. Excelente trabajo amigo, de verdad muy útil. Desde hace tiempo había estado buscando un tema de estos. La verdad muy pocos prestamos atención al manejo de errores

    • Andres
    • 20/11/12

    Excelente Post… yo estoy utilizando SQL Server 2012 y el unico cambio que presenta el Manejo de Errores es la sustitucion del RAISERROR por THROW, pero todo lo demás sigue igual y tu post me ayudo mucho a aclarar ciertas dudas que tenía.

  1. No trackbacks yet.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: