/*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
Lobyte --Julio César Soria P--
Un sitio de referencias y casos en el desarrollo de software.
febrero 18, 2012
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
--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
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!
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
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
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
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
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
Suscribirse a:
Entradas (Atom)


