febrero 24, 2011

Manejo de excepciones en SQL Server

Dos formas de manejar los errores con SQL Server, sólo que con el uso de Try-Catch únicamente se puede implementar en versiones 2005 o superior y con el uso de GOTO desde la 2000.

Ambas formas funcionan, pero es más practica y segura (por si se omite validar alguna instruccion que provoque excepción) la que protege todo el bloque que es propenso a excepción.


---- Uso clásico con uso de marcadores y GOTO

Declare @Msj nvarchar(200)
--Comienza la transacción
BEGIN TRANSACTION

    --UPDATE 1
    --DELETE 1
    --Insert 1
    --para simular error
    Select 1/0
    --Verificar si hubo errores
    IF @@Error != 0
       GOTO ERROR_HANDLER

   

--Finalizar la Transacción
COMMIT TRANSACTION
print 'OK fin transacción'
SET NOCOUNT OFF
RETURN

--Manejador de Error.
ERROR_HANDLER:
ROLLBACK TRANSACTION
--Imprimir msj de error
set @Msj = 'Tenemos el error # ' + CONVERT(VARCHAR(10), Error_number()) + ' ' +
          Error_message() + ' en la linea: ' + convert(varchar(10), ERROR_LINE())
RAISERROR 13000 @Msj
RETURN


-----Uso con Try-Catch de SQL Server 2005 o superior
Declare @Msj nvarchar(200)
--Comienza la transacción
BEGIN TRANSACTION
BEGIN Try
    --UPDATE 1
    --DELETE 1
    --Insert 1
    --para simular error
    Select 1/0
COMMIT TRANSACTION
END Try

BEGIN Catch

    
    ROLLBACK TRANSACTION
    --Imprimir msj de error
       set @Msj = 'Tenemos el error # ' + CONVERT(VARCHAR(10), Error_number()) + ' ' +
           Error_message() + ' en la linea: ' + convert(varchar(10), ERROR_LINE())
      
       --PRINT @Msj
    Raiserror 13000  @Msj    

END Catch

febrero 16, 2011

Modelo Entidad Relación para Control de Acceso en las Aplicaciones (Roles por Aplicación)

Tenemos la necesidad de un modelo de base de datos que nos permita el control de acceso a los objetos de nuestra aplicacion, es así que tenemos una tabla de Aplicaciones o Sistemas que se compone de objetos, por ejemplo formas o paginas, botones etc. luego definimos los roles que tendrán acceso a nuestro sistema o aplicacion, por ejemplo Administradores, invitados (lectores) , operadores etc y éstos tendrán determinados derechos para Consultar, Insertar, Actualizar u Eliminar (CRUD), definidos los roles y sus derechos a los obejtos de nuestras aplicaciones, asociamos éstos a nuestros Usuarios, así que tenemos un sólo Usuario que podra accesar a las diferentes aplicaciones o sistemas que tengamos a través de la definición de un rol para cada aplicación.
A continuación les muestro el modelo E/R propuesto, espero les pueda servir!



Asi se veria un query con la información del rol que tiene un usuario vs. una aplicación, con el que podrimos hacer un objeto que este presente durante toda la session que tenga el usuario ante una aplicación:








febrero 15, 2011

Como manejar los bloqueos en SQL Server

Hace un tiempo tuve el problema de la concurrencia y como efecto de ésta tenia muchos bloqueos y quejas de los usuarios porque el aplicativo no les confirmaba sus operciones. Me puse a buscar en Internet de que hacer ya que los bloqueos no tenia forma de como evitarlos, pero necesitaba al menos hacer algo para manejarlos y miren este buen articulo que encontre:

http://www.codeproject.com/KB/database/SQLServer_deadlock.aspx