Está en la página 1de 7

10 - Desencadenadores.

Objetivos:

Automatizar procedimientos dentro de la base de datos, por medio de


disparadores.

Recursos:

Microsoft SQL Server Management Studio


Guas prcticas.
Base de datos de ejemplo: scrum2.

Introduccin
Muchas veces es importante el poder proteger nuestras tablas y registros de acciones
accidentales o procesos que como diseadores no queremos que se realicen, una forma
de lograr este objetivo es el uso de Triggers.
Es importante mencionar que se deben tener los permisos necesarios para hacer algunos
procesos, y algunos de los procesos que signifiquen transacciones muy peligrosas deben
de ser realizadas con mucho cuidado.

Desencadenadores / Triggers
Un desencadenador es una clase especial de procedimiento almacenado que se ejecuta
automticamente cuando se produce un evento en el servidor de bases de datos. Los
desencadenadores DML se ejecutan cuando un usuario intenta modificar datos mediante
un evento de lenguaje de manipulacin de datos (DML). Los eventos DML son
instrucciones INSERT, UPDATE o DELETE de una tabla o vista. Estos desencadenadores se
activan cuando se desencadena cualquier evento vlido, con independencia de que las
filas de la tabla se vean o no afectadas.
Los desencadenadores DDL se ejecutan como respuesta a diversos eventos del lenguaje
de definicin de datos (DDL). Estos eventos corresponden principalmente a instrucciones
CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados
del sistema que ejecutan operaciones de tipo DDL.

RAISERROR
Genera un mensaje de error y se inicia el proceso de errores para la sesin. RAISERROR
puede o bien hacer referencia a un mensaje definido por el usuario almacenado en el
sys.messages vista de catlogo o construir un mensaje dinmicamente.

ROLLBACK TRANSACTION
Revierte una transaccin explcita o implcita al principio de la operacin, o en un punto de
almacenamiento dentro de la transaccin. Puede usar ROLLBACK TRANSACTION para
borrar todas las modificaciones de datos realizadas desde el inicio de la operacin o de un
punto de retorno. Tambin libera los recursos retenidos por la transaccin.

DISABLE TRIGGER y ENABLE TRIGGER


Tambin puedo activar (Enable) o desactivar (Disable) los disparadores, para realizar
algunos procesos o transacciones sin que se cumplan estos, tambin nos sirven de mucha
ayuda para realizar migraciones de datos.

FORMA GRAFICA
En primer lugar seleccionamos la base de datos en que quiero trabajar y la expando, para
nuestro ejemplo tomaremos la tabla roles, y seleccionaremos Triggers, segn muestra la
figura.

Presionaremos clic derecho y presionamos New Triggers, lo cual nos crear una nueva
consulta que nos mostrara la siguiente informacin:

-- ================================================
-- Template generated from Template Explorer using:
-- Create Trigger (New Menu).SQL
--- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--- See additional Create Trigger templates for more
-- examples of different Trigger statements.
--- This block of comments will not be included in
-- the definition of the function.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:
<Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name>
ON <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name>
AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
END
GO

Lo que haremos es editar este cdigo y lo dejaremos de la siguiente manera:


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER protege_roles
ON roles
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;
RAISERROR ('Esta tabla, no permite actualizar, modificar y agregar', 1, 1)
ROLLBACK TRANSACTION
END
GO

Ahora prueba las siguientes transacciones y mira los resultados.


INSERT INTO roles VALUES ('Nuevo Rol')
UPDATE roles SET rol = 'Project Manager' WHERE id_rol = 1

Estas dos consultas nos mostraran el mensaje 'Esta tabla, no permite actualizar,
agregar' No probaremos DELETE porque la relacin no me lo permitira.

modificar y

Ahora para desactivar este Triggers haremos lo siguiente, lo buscaremos en el explorador


de soluciones, base de datos, tabla, triggers como lo muestra la siguiente figura:

Al seleccionar Disable nos mostrara el siguiente aviso.

Ahora probemos nuevamente las siguientes consultas y veamos como funcionan.


INSERT INTO roles VALUES ('Nuevo Rol')
UPDATE roles SET rol = 'Project Manager' WHERE id_rol = 1
DELETE roles WHERE rol = 'Nuevo Rol'

Vern que las transacciones se realizan con normalidad.


Si queremos borrar o modificar el disparador, podemos presionando clic derecho sobre el
triggers y seleccionar Delete para borrar o Modify para cambiarla.

POR CONSOLA (T-SQL)


Vamos a crear un disparador que me proteja los descuentos de las personas, no
permitiendo que estos sean borrados, el nombre del disparador ser
protege_descuentos y lo programaremos de la siguiente forma.
CREATE TRIGGER protege_descuentos
ON descuentos
AFTER DELETE
AS
BEGIN
RAISERROR ('No puedes descuentos', 16, 1)
ROLLBACK TRANSACTION
RETURN
END

Ahora si tratas de borrar un registro o todos te mostrara el siguiente error.

Ahora haremos otro ejemplo que llamaremos limite_descuento en el cual usaremos un


subconsulta para permitir que se realice o no la transaccin.
CREATE TRIGGER limite_descuento
ON descuentos
AFTER INSERT
AS
IF EXISTS (SELECT * FROM descuentos WHERE monto > 75)
BEGIN
RAISERROR ('No se puede realizar este descuento es muy alto', 16, 1)
ROLLBACK TRANSACTION
RETURN
END

Ejercicios:

Elabore un disparador para cada tabla de la base de datos.


Cree una vista y pruebe si puede usar disparadores con ella.
Realice disparadores usando subconsultas.

Base de datos scrum2


CREATE DATABASE scrum2
GO
USE scrum2

GO
CREATE TABLE roles (
id_rol int IDENTITY(1,1),
rol varchar(20) not null,
CONSTRAINT PK_roles PRIMARY KEY (id_rol) )
CREATE TABLE pais (
id_pais int IDENTITY(1,1),
pais varchar(25),
CONSTRAINT PK_pais PRIMARY KEY (id_pais) )
CREATE TABLE personas (
id_persona int IDENTITY(1,1),
apellido varchar(40) not null,
nombre varchar(40) not null,
sueldo smallmoney,
celular varchar(8),
sexo varchar(1),
nacimiento date,
id_rol int not null,
id_pais int not null,
CONSTRAINT PK_persona PRIMARY KEY (id_persona),
CONSTRAINT FK_perrol FOREIGN KEY (id_rol)
REFERENCES roles(id_rol),
CONSTRAINT FK2_perpais FOREIGN KEY (id_pais)
REFERENCES pais(id_pais) )
CREATE TABLE tipo_descuento (
id_tipodes int IDENTITY(1,1),
descuento varchar(40) not null,
CONSTRAINT PK_descu PRIMARY KEY (id_tipodes) )
CREATE TABLE descuentos (
id_descu int IDENTITY(1,1),
monto smallmoney,
fecha date,
id_persona int not null,
id_tipodes int not null,
CONSTRAINT PK_descuentos PRIMARY KEY (id_descu),
CONSTRAINT FK_desper FOREIGN KEY (id_persona)
REFERENCES personas(id_persona),
CONSTRAINT FK2_destipo FOREIGN KEY (id_tipodes)
REFERENCES tipo_descuento(id_tipodes) )
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO
INTO
INTO

roles
roles
roles
roles
roles
roles
roles

VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES

INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO

pais
pais
pais
pais
pais
pais
pais
pais
pais
pais

INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO

personas
personas
personas
personas
personas

VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES

('ScrumMaster')
('ProductOwner')
('Team')
('Steakholders')
('Tester')
('Developer')
('Designer')

('El Salvador')
('Guatemala')
('Costa Rica')
('Japon')
('Estados Unidos')
('Argentina')
('Mexico')
('Uruguay')
('Canada')
('Chile')

VALUES
VALUES
VALUES
VALUES
VALUES

('Hernandez Mancia','Marielos',958,'67567555','F','1986/7/4',3,4)
('Perez Juarez','Joaquin',850,'34567564','M','1969/9/2',3,1)
('Solis Castro','Eduardo',600,'12327523','M','1972/3/11',3,1)
('Ramos Nieto','Jorge',550,'34567174','M','1972/10/4',4,1)
('Hernandez Carias','Johanna',1800,'34234809','F','1952/3/4',1,1)

INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO

personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas
personas

VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES

INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO

tipo_descuento
tipo_descuento
tipo_descuento
tipo_descuento
tipo_descuento

INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT

INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO

descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos
descuentos

('Romero Pea','Manuel Alberto',0,'34567342','M','1969/12/4',2,1)


('Garcia Alvarado','Roxana',1600,'34345564','F','1970/4/4',1,1)
('Torres Castro','Alfredo',450,'34565674','M','1980/2/9',3,5)
('Romero Pea','Verenice',400,'34567589','F','1978/3/17',3,1)
('Martinez','Evelyn Roxana',340,'34556764','F','1972/8/14',3,5)
('Siguenza','Eduardo',1120,'21467564','M','1975/10/9',3,1)
('Alas Duran','Martin',1200,'34562364','M','1972/3/4',3,1)
('Jerez M.','Jose Carlos',589,'34563352','M','1972/3/6',4,1)
('Bolaos Cea','Sandra',244,'67557564','F','1968/3/4',3,1)
('Cuestas D.','Jenny Maria',1089,'34567564','F','1972/9/14',3,4)
('Solorzano','Veronica',400,'34567589','F','1978/3/17',3,8)
('Martir','Roxana Maria',740,'34556764','F','1972/8/14',3,9)
('Siliezar','Eduardo Jose',920,'21467564','M','1975/10/9',3,8)
('Alas Dimas','Martin Alberto',1250,'34562364','M','1972/3/4',3,9)
('Juarez Gomez','Andrea',389,'34563352','F','1972/3/6',4,10)
('Bolaos Cea','Jenniffer',644,'67557564','F','1968/3/4',3,9)
('Palacios','Jenny Maria',1289,'34567564','F','1972/9/14',3,10)
('Gonzalez','Jenny Maria',789,'34567564','F','1987/9/13',7,4)
('Salas Valencia','Veronica',350,'34567589','F','1983/3/5',7,8)
('Mendez Rivera','Roxana Maria',1450,'34556764','F','1990/9/14',6,9)
('Salgado','Eduardo Jose',456,'21467564','M','1978/10/9',3,8)
('Menjivar','Martin Alberto',1000,'34562364','M','1969/3/4',3,9)
('Gomez Arriaza','Andrea',322,'34563352','F','1960/3/6',6,10)
('Menendez V.','Jenniffer',1080,'67557564','F','1979/4/14',3,9)
('Pocasangre','Jenny Maria',789,'34567564','F','1970/9/24',5,10)
('Perez','Jenny Maria',485,'34567564','F','1996/3/8',5,10)

VALUES
VALUES
VALUES
VALUES
VALUES

VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES

('Personal')
('Llegada Tardia')
('Amonestacion')
('Bancaria')
('Cooperativa')

(34.5,'2014/1/14',1,1)
(11.2,'2014/1/17',10,1)
(5,'2014/1/19',21,2)
(6.78,'2014/1/21',11,1)
(50,'2014/1/30',9,5)
(16.78,'2014/1/15',3,3)
(22,'2014/1/4',2,4)
(15,'2014/1/23',10,1)
(18.8,'2014/1/29',2,3)
(21,'2014/1/30',9,2)
(1.5,'2014/2/3',10,3)
(7.5,'2014/2/9',2,4)
(23.1,'2014/2/12',9,4)
(3.5,'2014/2/4',13,3)
(9.2,'2014/2/7',19,4)
(15,'2014/2/15',20,4)
(16.8,'2014/2/20',13,2)
(21,'2014/2/22',29,5)
(34.5,'2014/3/1',9,3)
(11.2,'2014/3/5',25,2)
(5,'2014/3/6',7,5)
(16.3,'2014/3/9',16,1)
(50,'2014/3/15',17,5)
(6.78,'2014/3/18',3,1)
(50,'2014/3/21',22,1)
(5,'2014/3/23',10,3)
(8.8,'2014/3/29',2,4)
(23,'2014/3/30',9,5)

También podría gustarte