febrero 18, 2012

Tabla Variable en sustitución al uso de un Cursor en SQL Server

/*cursor con tabla variable*/
declare @TablaVariableEmpleado table (
     id_Table int  identity(1,1) not null,--El valor semilla es el que nos permite obtener el valor consecutivo de 1 en 1 para poder iterar
     Empleado varchar(50) not null,
     Sueldo int not null
     )


declare @contador smallint --Contendrá el número de registros de la variable tabla
,@EmpleadoSueldoActual varchar(50)

--llenamos la tabla variable, con un query
--Insert into @TablaVariableEmpleado
--    select  Nombre, Sueldo
--    From Empleado
--    where sueldo <= 1000
   
    --llenado manual para caso de ejemplo (Empleado, Sueldo)
    INSERT INTO @TablaVariableEmpleado
    VALUES ('JUAN', 1000),
           ('JOSE',1200),
           ('MARIA',1500)


-- Extraemos el nº de registros que contiene lal tabla temporal
set @contador = isnull((Select count(*) From @TablaVariableEmpleado),0)
--SELECT @contador

-- Mientras tenga Datos …
While (@contador > 0)
Begin

    --Extraigo el identificador del campo que vamos a necesitar de acuerdo al contador que itera.
    Select @EmpleadoSueldoActual  = Empleado + ' sueldo actual: $ ' +  CONVERT(varchar(10), Sueldo)
    from @TablaVariableEmpleado
    where id_Table = @contador
   
    --mostrar valor extraido de la tabla variable de acuerdo al contador que itera.
    print @EmpleadoSueldoActual

    -- Operaciones a realizar cuando estamos recorriendo la tabla.
    --aumentar $100 al sueldo del empleado
    update @TablaVariableEmpleado
    set Sueldo = Sueldo +100
    where id_Table = @contador

    --Leemos el siguiente.
    Set @contador = @contador - 1

End--while

--mostrar resultado del procesamiento
select * from @TablaVariableEmpleado

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 17, 2011

Desarrollo de Software en 3 capas (los objetos Entity son transportadores entre las capas)

Los objetos Entity o también llamados: ValueObject son objetos que estan disponibles como transportadores entre las capas.

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

enero 30, 2011

Cómo enviar correo electrónico por código usando cuentas de GMail

Requeria enviar programaticamente emails,  pero no cuento con un servidor de email (SMTP), así que busque si se podia hacer a través de mi cuenta de GMAIL y encontré este fabuloso post con un ejemplo, lo probé y funciona a la perfección.

http://geeks.ms/blogs/jalarcon/archive/2007/06/23/c-243-mo-enviar-correo-electr-243-nico-por-c-243-digo-usando-cuentas-de-gmail.aspx

enero 29, 2011

Auditoria de instrucciones DDL

Con DDL Triggers apartir de SQL Server 2005 podemos auditar todos las operaciones de DDL a la BD

USE pruebas


--La tabla de auditoria
Create Table DDL_Auditoria(
Id int Not Null identity,
FechaEvento datetime not null,
TipoEvento SYSNAME not null,
UsuarioEvento SYSNAME not null,
NombreObjeto SYSNAME not null,
NombreObjetoObjetivo SYSNAME not null
)

--disparador
Create TRIGGER DDL_AuditoriaDML ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS
As

Declare @EV as XML
SET @EV = EVENTDATA()
INSERT INTO DDL_Auditoria
VALUES(
CAST(@EV.query('data(//PostTime)') as varchar(23)),
CAST(@EV.query('data(//EventType)') as Sysname),
CAST(@EV.query('data(//LoginName)') as Sysname),
CAST(@EV.query('data(//ObjectName)') as Sysname),
CAST(@EV.query('data(//TargetObjectName)') as Sysname)
)
go

--Probamos el disparador con 2 operaciones DDL y consultamos las entradas de auditoria en nuestra tabla
Create Table TablaNueva (Cve int)
go
Alter Table TablaNueva ADD Col2 int
go
Select * FROM DDL_Auditoria
go

DDL Triggers apartir de SQL Server 2005

En versiones anteriores sólo existian disparadores para operaciones DML para intrucciones INSERT, UPDATE y DELETE apartir de SQL Server 2005 es posible implementar disparadores para DDL

Por ejemplo:
USE pruebas

--Disparador que impediara modificar cualquier tabla de la BD.
Create Trigger DDL_1 ON DATABASE FOR ALTER_TABLE AS
     RAISERROR('No se puede alterar tablas en esta Base de Datos', 16, 1)
ROLLBACK
Go

--Para probar que no se puede alterar la tabla, intentaremos una intrucción DDL a la tabla.
Alter table T1 ADD COLUMNA3 Varchar(10)
go