Triggers Instead Of en SQL Server

Triggers de Tipo Instead of

Los triggers instead of son un tipo de Triggers que reemplazan las instrucciones que hace que se dispare, use estos tipos de Triggers cuando es necesario comprobar algunas condiciones al momento de realizar transacciones con los registros de tablas o vistas.

Por ejemplo: si se crea un Trigger de tipo instead of para la tabla Clientes al insertar un registro, al ejecutar un Insert es cuando este tipo de Trigger se va a ejecutar en lugar de la instrucción Insert en la tabla o vista.


Notas importantes

1. Estos tipos de triggers cancelan la instrucción que hace que se dispare, reemplazando
esta por las instrucciones del Trigger.
2. Generalmente se utilizan estos triggers en vistas
3. Las acciones que realice el trigger no deben cancelar la transacción que la dispara sino ejecutar las instrucciones cambiadas que son el cuerpo del trigger.

Ejemplo

Usando la base de datos Northwind

use Northwind
go

Para utilizar un Trigger de tipo instead of crearemos una vista llamada SociosEstrategicos con los Clientes
(Customers) y los Proveedores (Suppliers)

Primero: los Clientes

select C.CustomerID ‘Cód.Cliente’, C.CompanyName As ‘Cliente’,
C.Country As ‘País’
from Customers As C
go

Segundo: los proveedores

select S.SupplierID As ‘Cód. Proveedor’, S.CompanyName As ‘Proveedor’,
S.Country As ‘País’
from Suppliers As S
go

Al juntar los dos listados en la vista SociosEstrategicos, la instrucción Select para la vista es como sigue:

select C.CustomerID ‘Cód.Cliente’, C.CompanyName As ‘Cliente’,
C.Country As ‘País’
from Customers As C
union all
select Cast(S.SupplierID As nchar(5)) , S.CompanyName ,
S.Country
from Suppliers As S
go

Incluiremos una columna para diferenciar el tipo de socio, Cliente o Proveedor.  Además de cambiar los nombres de campos (Ver opciones de consultas Union)

select C.CustomerID ‘CodigoSocio’, C.CompanyName As ‘Socio’,
C.Country As ‘País’, ‘Cliente’ As Tipo
from Customers As C
union all
select Cast(S.SupplierID As nchar(5)) , S.CompanyName ,
S.Country , ‘Proveedor’ As Tipo
from Suppliers As S
go

En la imagen se muestra parte de los Clientes y Proveedores.

 

Creamos la vista (Ver Vistas)

Create view VistaSociosEstrategicos
As
select C.CustomerID ‘CodigoSocio’, C.CompanyName As ‘Socio’,
C.Country As ‘País’, ‘Cliente’ As Tipo
from Customers As C
union all
select Cast(S.SupplierID As nchar(5)) , S.CompanyName ,
S.Country , ‘Proveedor’ As Tipo
from Suppliers As S
go

Si se desea visualizar los socios estratégicos del negocio solamente listamos la vista

select * from VistaSociosEstrategicos
go

 

El Trigger se creará para la vista, será de tipo Instead Of (Ver Triggers)

create trigger trVistaSocioEstrategicoInsertar
on VistaSociosEstrategicos
instead of insert
as
insert into Customers (CustomerID, CompanyName, Country)
select CodidoSocio,Socio,País
from inserted where Tipo=’Cliente’

insert into Suppliers (CompanyName, Country)
select Socio,País
from inserted where Tipo=’Proveedor’
go

Al ejecutar una inserción en la vista


Insertar un Cliente

insert into VistaSociosEstrategicos
values (‘YT348′,’Sociedad SQL’,’France’,’Cliente’)
go

Listamos los clientes (tabla Customers)

select * from Customers where CompanyName Like ‘Soci%’
go

Insertar un Proveedor

insert into VistaSociosEstrategicos
values (‘BT599′,’Limbo Almacenes’,’Spain’,’Proveedor’)
go

Listamos los Proveedores (tabla Suppliers)

select * from Suppliers where CompanyName Like ‘Limbo%’
go

La vista tiene insertados los dos registros

select * from VistaSociosEstrategicos
where Socio like ‘Limbo%’  or Socio like ‘Soci%’
go

Note que al insertar registros en la vista debemos especificar todos los campos, en el Trigger para los proveedores no se especifica el código porque es un campo entero y es Identidad. (Ver Identity)