Listado completo de tutoriales
147 - Disparador (eliminar) |
Los triggers se eliminan con la instrucción "drop trigger":
drop trigger NOMBREDISPARADOR;
Si el disparador que se intenta eliminar no existe, aparece un mensaje indicándolo, para evitarlo, podemos verificar su existencia antes de solicitar su eliminación (como con cualquier otro objeto):
if object_id('NOMBREDISPARADOR') is not null
drop trigger NOMBREDISPARADOR;
Eliminamos, si existe, el trigger "dis_libros_insertar":
if object_id('dis_libros_insertar') is not null
drop trigger dis_libros_insertar;
Cuando se elimina una tabla o vista que tiene asociados triggers, todos los triggers asociados se eliminan automáticamente.
Ingresemos el siguiente lote de comandos en el SQL Server Management Studio:
if object_id('ventas') is not null
drop table ventas;
if object_id('libros') is not null
drop table libros;
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
precio decimal(6,2),
stock int,
constraint PK_libros primary key(codigo)
);
create table ventas(
numero int identity,
fecha datetime,
codigolibro int not null,
precio decimal (6,2),
cantidad int,
constraint PK_ventas primary key(numero),
constraint FK_ventas_codigolibro
foreign key (codigolibro) references libros(codigo)
);
go
insert into libros values('Uno','Richard Bach',15,100);
insert into libros values('Ilusiones','Richard Bach',18,50);
insert into libros values('El aleph','Borges',25,200);
insert into libros values('Aprenda PHP','Mario Molina',45,200);
go
-- Creamos un disparador para que se ejecute cada vez que una instrucción "insert"
-- ingrese datos en "ventas"; el mismo controlará que haya stock en "libros"
-- y actualizará el campo "stock":
create trigger DIS_ventas_insertar
on ventas
for insert
as
declare @stock int
select @stock= stock from libros
join inserted
on inserted.codigolibro=libros.codigo
where libros.codigo=inserted.codigolibro
if (@stock>=(select cantidad from inserted))
update libros set stock=stock-inserted.cantidad
from libros
join inserted
on inserted.codigolibro=libros.codigo
where codigo=inserted.codigolibro
else
begin
raiserror ('Hay menos libros en stock de los solicitados para la venta', 16, 1)
rollback transaction
end
go
set dateformat ymd;
-- Ingresamos un registro en "ventas":
insert into ventas values('2018/04/01',1,15,1);
-- Al ejecutar la sentencia de inserción anterior, se disparó el trigger, el registro
-- se agregó a la tabla del disparador ("ventas") y disminuyó el valor del campo "stock"
-- de "libros".
-- Verifiquemos que el disparador se ejecutó consultando la tabla "ventas" y "libros":
select * from ventas;
select * from libros where codigo=1;
-- Eliminamos trigger
drop trigger DIS_ventas_insertar;
insert into ventas values('2018/04/01',1,15,1);
-- Verifiquemos las tabla "ventas" y "libros":
select * from ventas;
select * from libros where codigo=1;
La ejecución de este lote de comandos SQL genera una salida similar a:
