Creación de procedimientos almacenados: ObtenerMensajeError y RegistrarBitacora

Fecha: sábado 18 de abril de 2026

Hora de inicio: 7:45 p.m.

Hora de finalización: 9:10 p.m.

Horas trabajadas: 1 h 25 min

El plan para esta sesión era implementar dos de los procedimientos almacenados que me correspondían y que eran prioritarios: ObtenerMensajeError y RegistrarBitacora. Acordé con Johana que yo me encargaba de ambos completamente y que los haría de primero ya que todas las funcionalidades los necesitan, tanto en capa de base de datos como en capa lógica. Era importante tenerlos listos cuanto antes para no bloquear el avance de las dos.

Actividades realizadas

7:45 p.m. – 8:10 p.m. — Investigación previa

Antes de escribir una sola línea de código, me puse a investigar las funciones del sistema que necesitaba para llenar la tabla DBError dentro del bloque CATCH. Sabía que tenía que capturar información del error (número, mensaje, línea, procedimiento, etc.), pero no conocía las funciones específicas de SQL Server para obtener esos datos.

Las funciones que tuve que investigar fueron:

  • ERROR_NUMBER(): retorna el número del error.
  • ERROR_STATE(): retorna el estado del error.
  • ERROR_SEVERITY(): retorna la severidad.
  • ERROR_LINE(): retorna la línea donde ocurrió el error.
  • ERROR_PROCEDURE(): retorna el nombre del SP donde ocurrió.
  • ERROR_MESSAGE(): retorna el mensaje descriptivo del error.
  • SUSER_NAME() / SUSER_SNAME(): retornan el nombre de inicio de sesión del usuario actual. Noté que en distintos ejemplos aparecían las dos versiones y tuve que investigar la diferencia: SUSER_NAME() acepta un parámetro opcional (el id del usuario), mientras que SUSER_SNAME() sin argumentos es equivalente, pero es la forma más común de verla en ejemplos de manejo de errores.

8:10 p.m. – 8:40 p.m. — SP: ObtenerMensajeError

Este SP recibe un código de error como parámetro y busca la descripción correspondiente en la tabla Error.

Después de crearlo lo probé con un EXEC desde SSMS pasándole un código que existía en la tabla y uno que no, para verificar que los dos casos funcionaran correctamente.

8:40 p.m. – 9:10 p.m. — SP: RegistrarBitacora

Este fue más directo de implementar una vez que tenía clara la estructura de BitacoraEvento. Recibe los cinco datos del evento (tipo, descripción, usuario, IP y timestamp) y los inserta en la tabla. Si el INSERT falla, el CATCH registra el error técnico en DBError.

Lo que me pareció importante destacar de este SP es que no recibe el timestamp con GETDATE() internamente, sino que lo recibe como parámetro (@inPostTime). Esto es intencional, pues el timestamp lo captura el SP que llama a RegistrarBitacora, no este SP en sí.

También lo probé con un EXEC básico para asegurarme de que insertara correctamente en BitacoraEvento y que no lanzara errores.

Forma de trabajo del equipo

Johana avanzó en paralelo con sus SPs (Login, Logout, ListarEmpleados e InsertarEmpleado). Nos mantuvimos en contacto por WhatsApp para coordinarnos, especialmente porque ella necesitaba que RegistrarBitacora estuviera disponible para poder llamarlo desde sus propios procedimientos. Mientras yo terminaba estos dos, ella fue avanzando en la lógica de los suyos.

Referencias:

Comentarios

Entradas más populares de este blog

Creación del SP de Cargar Datos

Implementación de funcionalidades: Editar Empleado y Eliminar Empleado

Implementación de funcionalidad: Consultar Empleado