Triggers Encriptados

Triggers Encriptados

Este artículo muestra como encriptar un trigger, es importante que en todo nivel exista un cuidado  con las instrucciones que realiza el trigger, la opción de encriptación evita que de alguna forma se pueda visualizar las instrucciones del Trigger usando el procedimiento almacenado (Ver Procedimientos Almacenados)
sp_helpText.

Los triggers DML son procedimientos que se disparan cuando en una tabla o vista se realizan las instrucciones Insert, Update o Delete. Para mayor información Ver Triggers.

Como se describe en el artículo de Triggers, estos permiten ejecutar un conjunto de instrucciones al realizar instrucciones de inserción, modificación o eliminación de registros y es importante proteger estas instrucciones, para eso podemos encriptarlos usando la opción  “with encryption”.



Como crear un trigger encriptado

Para crear un Trigger DML encriptado se utiliza:

CREATE [ OR ALTER ] TRIGGER [ Esquema . ]NombreTrigger
ON { tabla | vista } with encryption
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
AS
Begin
Instrucciones T-SQL
End
Note que después del nombre de la tabla o vista se utiliza la cláusula with encryption.

Ejercicios

Usando la base de datos Northwind
use Northwind
go

1. Crear un trigger para que se dispare cuando se actualiza una Region

Create trigger trRegionActualiza on  Region with encryption
for update
As
Begin
Print ‘Se actualizaron los datos’
End
go

Si se desea ver el texto del Trigger podemos utilizar el procedimiento almacenados sp_helptext.
sp_helpText trRegionActualiza
go
El mensaje que aparece es: El texto para el objeto ‘trRegionActualiza’ está cifrado.

Al actualizar los datos de una región se dispara el trigger, mostrando el mensaje.

Primero mostramos los registros para actualizar uno de ellos, el registro con código 4 se cambiará la descripción por Sur.

select * from Region
go

Actualizar Region

update Region set RegionDescription = ‘Sur’
where RegionID = 4
go

2. Crear un trigger para Region que no permita insertar o modificar una región con la descripción
de una región existente. Inicialmente se creará el Trigger sin encriptación.

Create trigger trRegionInsertaModificaSinDuplicado
on Region
for Insert, Update
As
Begin — Inicio del Trigger
— Contar la cantidad de registros con la misma descripción
if (select Count(Region.RegionID) from inserted, Region
where inserted.RegionDescription = Region.RegionDescription)>1
Begin
Rollback transaction — Anula la inserción o actualización
Print ‘No se realizó la transacción’
End
Else
Begin
Print ‘Se realizó la inserción o modificación…’
End
End — Final del Trigger
go

Visualizar el texto del objeto (Trigger) usando sp_helptext.
sp_helptext trRegionInsertaModificaSinDuplicado
go

Modificar el Trigger y encriptarlo

Alter trigger trRegionInsertaModificaSinDuplicado
on Region with encryption
for Insert, Update
As
Begin — Inicio del Trigger
— Contar la cantidad de registros con la misma descripción
if (select Count(Region.RegionID) from inserted, Region
where inserted.RegionDescription = Region.RegionDescription)>1
Begin
Rollback transaction — Anula la inserción o actualización
Print ‘No se realizó la transacción’
End
Else
Begin
Print ‘Se realizó la inserción o modificación…’
End
End — Final del Trigger
go

Visualizar el texto del objeto (Trigger) usando sp_helptext.
sp_helptext trRegionInsertaModificaSinDuplicado
go
El mensaje es: El texto para el objeto ‘trRegionInsertaModificaSinDuplicado’ está cifrado.

Probando el Trigger

Ver las regiones
select * from Region
go

Insertar una región
insert into Region values (25,’Ica’)
go

Insertar una región con la misma descripción de una existente (Ica)
insert into Region values (255,’Ica’)
go

3. Crear un trigger en Region que no permita borrar mas de un registro.

Create trigger trRegionBorrarUnRegistro on Region with encryption
for Delete
As
Begin
If (Select Count(*) from deleted) > 1
Begin
Rollback transaction
Print ‘No se puede borrar mas de un registro…’
End
End
go

Ver los registros de Region
select * from Region
go

Eliminar un registro de Region
delete Region where RegionID = 56
go

Eliminar varios registros
delete Region where RegionID in (34,87,25)
go
/* Mensaje
No se puede borrar mas de un registro…
Mens. 3609, Nivel 16, Estado 1, Línea 80
La transacción terminó en el desencadenador. Se anuló el lote.
*/

Si se debe eliminar los registros, hay que desactivar o eliminar el Trigger
Desactivar el Trigger (Ver Activar Desactivar Triggers)
Disable Trigger NombreTrigger on Tabla/Vista

Activar el Trigger
Enable Trigger NombreTrigger on Tabla/Vista

Para borrar las regiones con códigos 34,87,25

Desactivar el Trigger trRegionBorrarUnRegistro, borrar los registros y activar el Trigger

Disable Trigger trRegionBorrarUnRegistro on Region
go
delete Region where RegionID in (34,87,25)
go
Enable Trigger trRegionBorrarUnRegistro on Region
go

Ver los registros
select * from Region
go



Notas adicionales: