146 - Disparador (Instead Off y after) |
Una empresa almacena los datos de sus empleados en una tabla "empleados" y en otra tabla "clientes" los datos de sus clientes.
Eliminamos las tablas si existen:
if object_id('empleados') is not null drop table empleados; if object_id('clientes') is not null drop table clientes;
Creamos ambas tablas:
create table empleados( documento char(8) not null, nombre varchar(30), domicilio varchar(30), constraint PK_empleados primary key(documento) ); create table clientes( documento char(8) not null, nombre varchar(30), domicilio varchar(30), constraint PK_clientes primary key(documento) );
Eliminamos la siguiente vista:
if object_id('vista_empleados_clientes') is not null drop view vista_empleados_clientes;
Creamos una vista que muestra los datos de ambas tablas:
create view vista_empleados_clientes as select documento,nombre, domicilio, 'empleado' as condicion from empleados union select documento,nombre, domicilio,'cliente' from clientes;
Creamos un disparador sobre la vista "vista_empleados_clientes" para inserción, que redirija las inserciones a la tabla correspondiente:
create trigger DIS_empl_clie_insertar on vista_empleados_clientes instead of insert as insert into empleados select documento,nombre,domicilio from inserted where condicion='empleado' insert into clientes select documento,nombre,domicilio from inserted where condicion='cliente';
Ingresamos un empleado y un cliente en la vista:
insert into vista_empleados_clientes values('22222222','Ana Acosta', 'Avellaneda 345','empleado'); insert into vista_empleados_clientes values('23333333','Bernardo Bustos', 'Bulnes 587','cliente');
Veamos si se almacenaron en la tabla correspondiente:
select *from empleados; select *from clientes;
Creamos un disparador sobre la vista "vista_empleados_clientes" para el evento "update", que redirija las actualizaciones a la tabla correspondiente:
create trigger DIS_empl_clie_actualizar on vista_empleados_clientes instead of update as declare @condicion varchar(10) set @condicion = (select condicion from inserted) if update(documento) begin raiserror('Los documentos no pueden modificarse', 10, 1) rollback transaction end else begin if @condicion ='empleado' begin update empleados set empleados.nombre=inserted.nombre, empleados.domicilio=inserted.domicilio from empleados join inserted on empleados.documento=inserted.documento end else if @condicion ='cliente' begin update clientes set clientes.nombre=inserted.nombre, clientes.domicilio=inserted.domicilio from clientes join inserted on clientes.documento=inserted.documento end end;
Realizamos una actualización sobre la vista, de un empleado:
update vista_empleados_clientes set nombre= 'Ana Maria Acosta' where documento='22222222';
Veamos si se actualizó la tabla correspondiente:
select *from empleados;
Realizamos una actualización sobre la vista, de un cliente:
update vista_empleados_clientes set domicilio='Bulnes 1234' where documento='23333333';
Veamos si se actualizó la tabla correspondiente:
select *from clientes;