145 - Disparadores (varios eventos) |
Una empresa almacena los datos de sus empleados en una tabla denominada "empleados" y los datos de las distintas sucursales en una tabla "sucursales". 1- Elimine las tablas si existen: if object_id('empleados') is not null drop table empleados; if object_id('sucursales') is not null drop table sucursales; 2- Cree las tablas, con las siguientes estructuras: create table sucursales( codigo int identity, domicilio varchar(30), constraint PK_sucursales primary key (codigo) ); create table empleados( documento char(8) not null, nombre varchar(30), domicilio varchar(30), sucursal int not null, constraint PK_empleados primary key (documento), constraint FK_empleados_sucursal foreign key(sucursal) references sucursales(codigo) ); 3- Ingrese algunos registros en las dos tablas: insert into sucursales values ('Colon 123'); insert into sucursales values ('Sucre 234'); insert into sucursales values ('Rivadavia 345'); insert into empleados values ('22222222','Ana Acosta','Avellaneda 1258',1); insert into empleados values ('23333333','Betina Bustos','Bulnes 345',2); insert into empleados values ('24444444','Carlos Caseres','Caseros 948',3); insert into empleados values ('25555555','Fabian Fuentes','Francia 845',1); insert into empleados values ('26666666','Gustavo Garcia','Guemes 587',2); insert into empleados values ('27777777','Maria Morales','Maipu 643',3); 4- Cree un disparador de inserción, eliminación y actualización que no permita modificaciones en la tabla "empleados" si tales modificaciones afectan a empleados de la sucursal de 1. 5- Ingrese un empleado en la sucursal 3. El trigger se dispara permitiendo la transacción; 6- Intente ingresar un empleado en la sucursal 1. El trigger se dispara y deshace la transacción. 7- Ejecute un "update" sobre "empleados" que permita la transacción. 8- Ejecute un "update" sobre "empleados" que el trigger deshaga. 9- Elimine un empleado (o varios) que no sean de la sucursal 1. El trigger se ejecuta y la transacción se realiza. 10- Intente eliminar un empleado (o varios) de la sucursal 1. El trigger deshace la transacción.Ver solución
if object_id('empleados') is not null drop table empleados; if object_id('sucursales') is not null drop table sucursales; create table sucursales( codigo int identity, domicilio varchar(30), constraint PK_sucursales primary key (codigo) ); create table empleados( documento char(8) not null, nombre varchar(30), domicilio varchar(30), sucursal int not null, constraint PK_empleados primary key (documento), constraint FK_empleados_sucursal foreign key(sucursal) references sucursales(codigo) ); insert into sucursales values ('Colon 123'); insert into sucursales values ('Sucre 234'); insert into sucursales values ('Rivadavia 345'); insert into empleados values ('22222222','Ana Acosta','Avellaneda 1258',1); insert into empleados values ('23333333','Betina Bustos','Bulnes 345',2); insert into empleados values ('24444444','Carlos Caseres','Caseros 948',3); insert into empleados values ('25555555','Fabian Fuentes','Francia 845',1); insert into empleados values ('26666666','Gustavo Garcia','Guemes 587',2); insert into empleados values ('27777777','Maria Morales','Maipu 643',3); create trigger dis_empleados on empleados for insert,update,delete as declare @suc int if (exists (select *from inserted where sucursal=1)) or (exists (select *from deleted where sucursal=1)) begin raiserror('No puede modificar datos de empleados de la sucursal 1', 16, 1) rollback transaction end; insert into empleados values ('30000000','Zulma Zapata','Suiza 258',3); insert into empleados values ('31111111','Ricardo Rojas','Rivadavia 256',1); update empleados set domicilio='Avellaneda 234' where documento='23333333'; update empleados set domicilio='Avellaneda 234' where documento='22222222'; delete from empleados where documento='25555555'; delete from empleados where documento='30000000';