Listado completo de tutoriales
150 - disparador (deshabilitar y habilitar) |
Se puede deshabilitar o habilitar un disparador específico de una tabla o vista, o todos los disparadores que tenga definidos.
Si se deshabilita un disparador, éste sigue existiendo, pero al ejecutar una instrucción "insert", "update" o "delete" en la tabla, no se activa.
Sintaxis para deshabilitar o habilitar un disparador:
alter table NOMBRETABLA ENABLE | DISABLE trigger NOMBREDISPARADOR;
El siguiente ejemplo deshabilita un trigger:
alter table empleados disable trigger dis_empleados_borrar;
Se pueden deshabilitar (o habilitar) varios disparadores en una sola sentencia, separando sus nombres con comas. El siguiente ejemplo deshabilitamos dos triggers definidos sobre la tabla empleados:
alter table empleados disable trigger dis_empleados_actualizar, dis_empleados_insertar;
Sintaxis para habilitar (o deshabilitar) todos los disparadores de una tabla específica:
alter table NOMBRETABLA ENABLE | DISABLE TRIGGER all;
La siguiente sentencia habilita todos los triggers de la tabla "empleados":
alter table empleados enable trigger all;
Ingresemos el siguiente lote de comandos en el SQL Server Management Studio:
if object_id('empleados') is not null
drop table empleados;
create table empleados(
documento char(8) not null,
nombre varchar(30) not null,
domicilio varchar(30),
seccion varchar(20),
constraint PK_empleados primary key(documento),
);
go
insert into empleados values('22222222','Ana Acosta','Bulnes 56','Secretaria');
insert into empleados values('23333333','Bernardo Bustos','Bulnes 188','Contaduria');
insert into empleados values('24444444','Carlos Caseres','Caseros 364','Sistemas');
insert into empleados values('25555555','Diana Duarte','Colon 1234','Sistemas');
insert into empleados values('26666666','Diana Duarte','Colon 897','Sistemas');
insert into empleados values('27777777','Matilda Morales','Colon 542','Gerencia');
go
-- Creamos un disparador para que no permita eliminar más de un registro a la vez
-- de la tabla empleados:
create trigger dis_empleados_borrar
on empleados
for delete
as
if (select count(*) from deleted)>1
begin
raiserror('No puede eliminar más de un 1 empleado', 16, 1)
rollback transaction
end;
go
-- Creamos un disparador para que no permita actualizar el campo "documento"
-- de la tabla "empleados":
create trigger dis_empleados_actualizar
on empleados
for update
as
if update(documento)
begin
raiserror('No puede modificar el documento de los empleados', 16, 1)
rollback transaction
end;
go
-- Creamos un disparador para que no permita ingresar empleados
-- en la sección "Gerencia":
create trigger dis_empleados_insertar
on empleados
for insert
as
if (select seccion from inserted)='Gerencia'
begin
raiserror('No puede ingresar empleados en la sección "Gerencia".', 16, 1)
rollback transaction
end;
go
-- Intentamos borrar varios empleados (El trigger se dispara, muestra el
-- mensaje y deshace la transacción):
delete from empleados where domicilio like 'Bulnes%';
go
-- Deshabilitamos el trigger para el evento de eliminación:
alter table empleados
disable trigger dis_empleados_borrar;
go
-- Borramos varios empleados (El trigger no se disparó porque está deshabilitado):
delete from empleados where domicilio like 'Bulnes%';
-- Podemos verificar que los registros de eliminaron recuperando los datos de la tabla:
select * from empleados;
-- Intentamos modificar un documento (El trigger se dispara, muestra el mensaje
-- y deshace la transacción):
update empleados set documento='23030303' where documento='23333333';
-- Intentamos ingresar un nuevo empleado en "Gerencia" (El trigger se dispara,
-- muestra el mensaje y deshace la transacción.):
insert into empleados values('28888888','Juan Juarez','Jamaica 123','Gerencia');
go
-- Deshabilitamos los disparadores de inserción y actualización definidos sobre "empleados":
alter table empleados
disable trigger dis_empleados_actualizar, dis_empleados_insertar;
go
-- Ejecutamos la sentencia de actualización del documento (El trigger no se dispara porque
-- está deshabilitado, el documento se actualizó):
update empleados set documento='20000444' where documento='24444444';
-- Verifiquémoslo:
select * from empleados;
-- Ingresar un nuevo empleado en "Gerencia" (El trigger "dis_empleados_insertar"
-- no se dispara porque está deshabilitado):
insert into empleados values('28888888','Juan Juarez','Jamaica 123','Gerencia');
-- Verifiquémoslo:
select * from empleados;
go
-- Habilitamos todos los triggers de la tabla "empleados":
alter table empleados
enable trigger all;
go
-- Ya no podemos eliminar más de un registro, actualizar un documento
-- ni ingresar un empleado en la sección "Gerencia"; lo intentamos
-- (El trigger se dispara (está habilitado), muestra el mensaje y deshace la transacción):
update empleados set documento='30000000' where documento='28888888';