SlideShare una empresa de Scribd logo
Triggers o Disparadores SQL
Triggers SQL
Todos estaremos de acuerdo en que una de las cosas más importantes en
todo negocio son los datos, ¿verdad? Pues bien, imagineuna basede datos
sobre la que interactúan concurrentemente muchos usuarios a través de
distintas aplicaciones, web o de escritorio. ¿Qué sucedería si una de estas
aplicaciones gestionase los datos incorrectamente?
Por ejemplo, imagine una aplicación de escritorio que interactúa
directamente a través de JDBC con el BD y que dicha aplicación usa la hora
de la máquina del usuario como hora en la que se realizan las operaciones,
¿terrible, ¿verdad? pues bien, estos y otros problemas pueden ser
solucionados con mecanismos como los Triggers o disparadores de BD
(como veremos en los ejemplos).
Los Triggers o disparadores son objetos de la base de datos que
ejecutan acciones cuando se producen ciertos eventos (tanto DML como
DDL) (inserciones, modificaciones, borrados, creación de tablas, etc.).
A continuación, y a modo de consulta os voy a mostrar un ejemplo de un
Triggers DML que realiza las siguientes tareas:
Dada una tabla con información sobre “expedientes”, vamos a crear un
Triggers que controle las modificaciones del “estado del expediente” de la
siguiente manera:
1. Anotará en el campo “stateChangedDate” la fecha/hora en la que se
produjo un cambio de estado.
2. A modo de histórico, insertará un registro en tabla “expStatusHistory”
con información sobrelos cambios de estado de cada expediente.
Fácil ¿verdad?, pues bueno, mamos a la obra.
 Ejemplo auto comentado en MySQL
 Ejemplo auto comentado en SQL Server
Ejemplo en MySQL.
1
2
DELIMITER$$
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
USE db_test;
$$
# Creamos el Schema si no existe
CREATE SCHEMA IF NOTEXISTS db_test;
$$
-- Eliminamos el procedimiento almacenado si existise
DROP PROCEDURE IF EXISTS db_test. procedureTemp;
$$
CREATE PROCEDURE db_test. procedureTemp ()
BEGIN
DECLARE cuenta INTDEFAULT 0;
-- Si no existe la tabla de expedientes, la creamos.
SELECT COUNT (*) INTO cuenta FROM `information_Schema`. `tables`
WHERE TABLE_SCHEMA='db_test' AND TABLE_NAME='expedientes' LI
MIT1;
IF (cuenta = 0) THEN
CREATE TABLE `expedientes` (
code VARCHAR(15) NOT NULL COMMENT'Código del exped
iente',
state VARCHAR(20) COMMENT 'Estado del expediente',
stateChangedDate DATETIME COMMENT'Fecha/Hora en la que s
e produció el último cambio de estado',
PRIMARY KEY `PK_Exp` (code)
) ENGINE=InnoDBCHARSET=utf8 collate=utf8_general_ci;
END IF;
-- Insertamos algunos expedientes de ejemplo
DELETE FROM expedientes WHEREcode IN('exp1','exp2', 'exp3');
INSERTINTO expedientes (code) VALUES ('exp1');
INSERTINTO expedientes (code) VALUES ('exp2');
INSERTINTO expedientes (code) VALUES ('exp3');
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
-- Si no existe la tabla de cambios de esstado la creamos
SELECT COUNT (*) INTO cuenta FROM `information_Schema`.`tables`
WHERE TABLE_SCHEMA='db_test' AND TABLE_NAME='expStatusHisto
ry' LIMIT1;
IF (cuenta = 0) THEN
CREATE TABLE `expStatusHistory`(
`id` INT AUTO_INCREMENT,
`code` VARCHAR (15) NOTNULL COMMENT 'Código del expediente
',
`state` VARCHAR (20) NOTNULL COMMENT 'Estado del expediente
',
`date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT'F
echa/Hora en la que el expediente pasó a ese estado',
PRIMARY KEY `PK_ExpHistory` (`id`)
) ENGINE=MyISAM CHARSET=utf8 collate=utf8_general_ci; -- No tra
nsacciones => MyISAM
END IF;
END;
$$
-- Invocamos elprocedimiento almacenado
CALL db_test. procedureTemp ();
$$
-- Borramos el procedimiento almacenado
DROP PROCEDURE IF EXISTS db_test. procedureTemp;
$$
-- Borramos el Triggers siexistise
DROP TRIGGERIF EXISTS StatusChangeDateTrigger;
$$
-- Cremamos un Triggers sobrela tabla expedientes
83
84
85
86
87
88
CREATE TRIGGERStatusChangeDateTrigger
BEFORE UPDATE ON expedientes FOR EACH ROW
BEGIN
-- ¿Ha cambiado el estado?
IF NEW.state! = OLD.stateTHEN
-- Actualizamos el campo stateChangedDatea la fecha/hora act
ual
SET NEW.stateChangedDate= NOW ();
-- A modo de auditoría, añadimos un registro en la tabla expStat
usHistory
INSERTINTO expStatusHistory (`code`, `state`) VALUES (NEW.co
de, NEW.state);
END IF;
END;
$$
DELIMITER;
Ejemplo en SQL Server.
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- --------------------------------------------------------------------
-- Creamos una base de datos si no existiese.
-- --------------------------------------------------------------------
IF NOTEXISTS (SELECT * from sys. databases wherename= 'db_test')
BEGIN
CREATE DATABASE db_test;
END
-- Establecemos la basede datos predeterminada
USE db_test;
-- --------------------------------------------------------------------
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
-- Creamos una tabla si no existiese.
-- Representa los datos de expedientes
-- --------------------------------------------------------------------
IF NOTEXISTS (SELECT * FROM sys. sys. objects WHEREname='expedie
ntes' AND xtype='U')
BEGIN
CREATE TABLE expedientes (
code VARCHAR(15) NOT NULL,
state VARCHAR(20) DEFAULT 'INICIO',
stateChangedDate DATETIME,
PRIMARY KEY (code)
);
END;
-- Insertamos algunos expedientes de ejemplo
DELETE FROM expedientes WHERE code IN('exp1','exp2', 'exp3');
INSERT INTO expedientes (code) VALUES ('exp1');
INSERT INTO expedientes (code) VALUES ('exp2');
INSERT INTO expedientes (code) VALUES ('exp3');
-- Si no existe la tabla de cambios de esstado la creamos
IF NOTEXISTS (SELECT * FROM sys. sys. objects WHEREname='expStat
usHistory' AND xtype='U')
BEGIN
CREATE TABLE expStatusHistory (
id INT IDENTITY,
code VARCHAR (15) NOTNULL,
state VARCHAR(20) NOTNULL,
date DATETIME DEFAULT GetDate (),
PRIMARY KEY (id)
);
END;
-- Borramos el Triggers siexistise
IF OBJECT_ID ('StatusChangeDateTrigger', 'TR') IS NOTNULL
BEGIN
DROP TRIGGERStatusChangeDateTrigger;
END;
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
GO -- Necesario
-- Cremamos un Triggers sobrela tabla expedientes
CREATE TRIGGERStatusChangeDateTrigger
ON expedientes
AFTER UPDATE AS
-- ¿Ha cambiado el estado?
IF UPDATE(state)
BEGIN
-- Actualizamos el campo stateChangedDate a la fecha/hora actu
al
UPDATEexpedientes SET stateChangedDate=GetDate () WHERE
code= (SELECT code FROM inserted);
-- A modo de auditoría, añadimos un registro en la tabla expStatusHi
story
INSERTINTO expStatusHistory (code, state) (SELECTcode, state
FROM deleted WHEREcode=deleted. code);
-- La tabla deleted contiene información sobrelos valores ANTIGUOS
mientras que la tabla inserted contiene los NUEVOS valores.
-- Ambas tablas son virtuales y tienen la misma estructura que la tab
la a la que se asocia el Trigger.
END;

Más contenido relacionado

DOCX
Trabajo grupal - Base de Datos
DOC
Procedimientos Almacenados
PDF
Programación MySQL-Ejercicios
PDF
Commit&rollback
PDF
Triggers o disparadores en MySQL
PDF
Practica form builder
PPS
Triggers
Trabajo grupal - Base de Datos
Procedimientos Almacenados
Programación MySQL-Ejercicios
Commit&rollback
Triggers o disparadores en MySQL
Practica form builder
Triggers

La actualidad más candente (20)

PPTX
Disparadores
DOCX
Carlos eduardo, documento de aplicacion en android
DOCX
PPTX
SQL Server rápido y furioso
PDF
Transacciones y sql procedural EN MySQL
PDF
Práctica Completa en Flash – ActionScript
DOC
MANUAL
ODP
Bc kardex sae 5.0
PDF
Ejemplo de base de datos y reports con jasper report
PDF
Taller de MySQL (DDL)
PDF
Hack x crack_sq_linjection
PPTX
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
PDF
Uso java jdbc
DOCX
Sesión02 - Creación de objetos (Oracle)
PDF
Tallerprogramacion
PDF
Procedimientos almacenados en MySQL
DOC
Sql procedimientos-almacenados
PPT
PDF
BigData - NoSQL
PPT
9. Uso De Procedimientos Almacenados
Disparadores
Carlos eduardo, documento de aplicacion en android
SQL Server rápido y furioso
Transacciones y sql procedural EN MySQL
Práctica Completa en Flash – ActionScript
MANUAL
Bc kardex sae 5.0
Ejemplo de base de datos y reports con jasper report
Taller de MySQL (DDL)
Hack x crack_sq_linjection
TRANSACCIONES, TRIGGERS, PROCEDIMIENTOS ALMACENADOS: DB2/IBM
Uso java jdbc
Sesión02 - Creación de objetos (Oracle)
Tallerprogramacion
Procedimientos almacenados en MySQL
Sql procedimientos-almacenados
BigData - NoSQL
9. Uso De Procedimientos Almacenados
Publicidad

Destacado (14)

PPTX
ESTRUCTURA SOCIAL LIZ ALTUVE T8
PDF
Vistas
PDF
SPACE DETECTIVE - EPK small
DOCX
Funciones de sql server
DOCX
Triggers disparador
PPTX
Estructura social
DOCX
Tupac amaru
PPTX
Caso de estudio joins
DOCX
Procedimientos almacenados ensql actualizar
PDF
HEMANT'S RESUME- B
PPSX
Bienvenida a android
PPTX
Arbitration power point
PPTX
Bryan Berger on Distraction Free Design Sprints at Design Driven NYC
PPT
Sistemul solar
ESTRUCTURA SOCIAL LIZ ALTUVE T8
Vistas
SPACE DETECTIVE - EPK small
Funciones de sql server
Triggers disparador
Estructura social
Tupac amaru
Caso de estudio joins
Procedimientos almacenados ensql actualizar
HEMANT'S RESUME- B
Bienvenida a android
Arbitration power point
Bryan Berger on Distraction Free Design Sprints at Design Driven NYC
Sistemul solar
Publicidad

Similar a Trigger disparadoes (20)

PDF
Ejemplo bbdd sqlite (android)
PDF
Ejemplo Base de Datos SQLite (Android)
PDF
Manualitosqlserver
PPTX
instalacion y conexion a base de datos postgrest /java
PDF
Textos sqli_mssql
PDF
ManualPracticoSQL.pdf
PPTX
Disparadores
PPTX
Disparadores
PDF
Portafolio 1 sql
PPT
7090112 Clase Transact Sql Server
DOC
PDF
Auditoria en oracle
ODP
Programacion de bases de datos en OOoBasic
PDF
Manual practico para sql ingieneria de sistemas
PDF
Manual practicosql
PDF
Manual practico-sql
PDF
Manual practico SQL
PDF
Manual practico SQL
PPT
Afinamientodebasesdedatosyservidoreswebs
Ejemplo bbdd sqlite (android)
Ejemplo Base de Datos SQLite (Android)
Manualitosqlserver
instalacion y conexion a base de datos postgrest /java
Textos sqli_mssql
ManualPracticoSQL.pdf
Disparadores
Disparadores
Portafolio 1 sql
7090112 Clase Transact Sql Server
Auditoria en oracle
Programacion de bases de datos en OOoBasic
Manual practico para sql ingieneria de sistemas
Manual practicosql
Manual practico-sql
Manual practico SQL
Manual practico SQL
Afinamientodebasesdedatosyservidoreswebs

Último (20)

PDF
OK OK UNIDAD DE APRENDIZAJE 5TO Y 6TO CORRESPONDIENTE AL MES DE AGOSTO 2025.pdf
PPTX
caso clínico iam clinica y semiología l3.pptx
PDF
ACERTIJO Súper Círculo y la clave contra el Malvado Señor de las Formas. Por ...
PDF
Salvese Quien Pueda - Andres Oppenheimer Ccesa007.pdf
PDF
Salcedo, J. et al. - Recomendaciones para la utilización del lenguaje inclusi...
DOCX
PROYECTO DE APRENDIZAJE para la semana de fiestas patrias
PDF
Híper Mega Repaso Histológico Bloque 3.pdf
PDF
Cronograma de clases de Práctica Profesional 2 2025 UDE.pdf
DOCX
III Ciclo _ Plan Anual 2025.docx PARA ESTUDIANTES DE PRIMARIA
PDF
Lección 6 Escuela Sab. A través del mar rojo.pdf
PDF
Romper el Circulo de la Creatividad - Colleen Hoover Ccesa007.pdf
PDF
Educación Artística y Desarrollo Humano - Howard Gardner Ccesa007.pdf
PDF
PFB-MANUAL-PRUEBA-FUNCIONES-BASICAS-pdf.pdf
PDF
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
PDF
Integrando la Inteligencia Artificial Generativa (IAG) en el Aula
DOCX
UNIDAD DE APRENDIZAJE 5 AGOSTO tradiciones
PDF
Metodologías Activas con herramientas IAG
DOCX
V UNIDAD - SEGUNDO GRADO. del mes de agosto
PDF
Punto Critico - Brian Tracy Ccesa007.pdf
PPTX
AGENTES PATÓGENOS Y LAS PRINCIPAL ENFERMEAD.pptx
OK OK UNIDAD DE APRENDIZAJE 5TO Y 6TO CORRESPONDIENTE AL MES DE AGOSTO 2025.pdf
caso clínico iam clinica y semiología l3.pptx
ACERTIJO Súper Círculo y la clave contra el Malvado Señor de las Formas. Por ...
Salvese Quien Pueda - Andres Oppenheimer Ccesa007.pdf
Salcedo, J. et al. - Recomendaciones para la utilización del lenguaje inclusi...
PROYECTO DE APRENDIZAJE para la semana de fiestas patrias
Híper Mega Repaso Histológico Bloque 3.pdf
Cronograma de clases de Práctica Profesional 2 2025 UDE.pdf
III Ciclo _ Plan Anual 2025.docx PARA ESTUDIANTES DE PRIMARIA
Lección 6 Escuela Sab. A través del mar rojo.pdf
Romper el Circulo de la Creatividad - Colleen Hoover Ccesa007.pdf
Educación Artística y Desarrollo Humano - Howard Gardner Ccesa007.pdf
PFB-MANUAL-PRUEBA-FUNCIONES-BASICAS-pdf.pdf
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
Integrando la Inteligencia Artificial Generativa (IAG) en el Aula
UNIDAD DE APRENDIZAJE 5 AGOSTO tradiciones
Metodologías Activas con herramientas IAG
V UNIDAD - SEGUNDO GRADO. del mes de agosto
Punto Critico - Brian Tracy Ccesa007.pdf
AGENTES PATÓGENOS Y LAS PRINCIPAL ENFERMEAD.pptx

Trigger disparadoes

  • 1. Triggers o Disparadores SQL Triggers SQL Todos estaremos de acuerdo en que una de las cosas más importantes en todo negocio son los datos, ¿verdad? Pues bien, imagineuna basede datos sobre la que interactúan concurrentemente muchos usuarios a través de distintas aplicaciones, web o de escritorio. ¿Qué sucedería si una de estas aplicaciones gestionase los datos incorrectamente? Por ejemplo, imagine una aplicación de escritorio que interactúa directamente a través de JDBC con el BD y que dicha aplicación usa la hora de la máquina del usuario como hora en la que se realizan las operaciones, ¿terrible, ¿verdad? pues bien, estos y otros problemas pueden ser solucionados con mecanismos como los Triggers o disparadores de BD (como veremos en los ejemplos). Los Triggers o disparadores son objetos de la base de datos que ejecutan acciones cuando se producen ciertos eventos (tanto DML como DDL) (inserciones, modificaciones, borrados, creación de tablas, etc.). A continuación, y a modo de consulta os voy a mostrar un ejemplo de un Triggers DML que realiza las siguientes tareas: Dada una tabla con información sobre “expedientes”, vamos a crear un Triggers que controle las modificaciones del “estado del expediente” de la siguiente manera: 1. Anotará en el campo “stateChangedDate” la fecha/hora en la que se produjo un cambio de estado. 2. A modo de histórico, insertará un registro en tabla “expStatusHistory” con información sobrelos cambios de estado de cada expediente. Fácil ¿verdad?, pues bueno, mamos a la obra.  Ejemplo auto comentado en MySQL  Ejemplo auto comentado en SQL Server Ejemplo en MySQL. 1 2 DELIMITER$$
  • 2. 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 USE db_test; $$ # Creamos el Schema si no existe CREATE SCHEMA IF NOTEXISTS db_test; $$ -- Eliminamos el procedimiento almacenado si existise DROP PROCEDURE IF EXISTS db_test. procedureTemp; $$ CREATE PROCEDURE db_test. procedureTemp () BEGIN DECLARE cuenta INTDEFAULT 0; -- Si no existe la tabla de expedientes, la creamos. SELECT COUNT (*) INTO cuenta FROM `information_Schema`. `tables` WHERE TABLE_SCHEMA='db_test' AND TABLE_NAME='expedientes' LI MIT1; IF (cuenta = 0) THEN CREATE TABLE `expedientes` ( code VARCHAR(15) NOT NULL COMMENT'Código del exped iente', state VARCHAR(20) COMMENT 'Estado del expediente', stateChangedDate DATETIME COMMENT'Fecha/Hora en la que s e produció el último cambio de estado', PRIMARY KEY `PK_Exp` (code) ) ENGINE=InnoDBCHARSET=utf8 collate=utf8_general_ci; END IF; -- Insertamos algunos expedientes de ejemplo DELETE FROM expedientes WHEREcode IN('exp1','exp2', 'exp3'); INSERTINTO expedientes (code) VALUES ('exp1'); INSERTINTO expedientes (code) VALUES ('exp2'); INSERTINTO expedientes (code) VALUES ('exp3');
  • 3. 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 -- Si no existe la tabla de cambios de esstado la creamos SELECT COUNT (*) INTO cuenta FROM `information_Schema`.`tables` WHERE TABLE_SCHEMA='db_test' AND TABLE_NAME='expStatusHisto ry' LIMIT1; IF (cuenta = 0) THEN CREATE TABLE `expStatusHistory`( `id` INT AUTO_INCREMENT, `code` VARCHAR (15) NOTNULL COMMENT 'Código del expediente ', `state` VARCHAR (20) NOTNULL COMMENT 'Estado del expediente ', `date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT'F echa/Hora en la que el expediente pasó a ese estado', PRIMARY KEY `PK_ExpHistory` (`id`) ) ENGINE=MyISAM CHARSET=utf8 collate=utf8_general_ci; -- No tra nsacciones => MyISAM END IF; END; $$ -- Invocamos elprocedimiento almacenado CALL db_test. procedureTemp (); $$ -- Borramos el procedimiento almacenado DROP PROCEDURE IF EXISTS db_test. procedureTemp; $$ -- Borramos el Triggers siexistise DROP TRIGGERIF EXISTS StatusChangeDateTrigger; $$ -- Cremamos un Triggers sobrela tabla expedientes
  • 4. 83 84 85 86 87 88 CREATE TRIGGERStatusChangeDateTrigger BEFORE UPDATE ON expedientes FOR EACH ROW BEGIN -- ¿Ha cambiado el estado? IF NEW.state! = OLD.stateTHEN -- Actualizamos el campo stateChangedDatea la fecha/hora act ual SET NEW.stateChangedDate= NOW (); -- A modo de auditoría, añadimos un registro en la tabla expStat usHistory INSERTINTO expStatusHistory (`code`, `state`) VALUES (NEW.co de, NEW.state); END IF; END; $$ DELIMITER; Ejemplo en SQL Server. Shell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -- -------------------------------------------------------------------- -- Creamos una base de datos si no existiese. -- -------------------------------------------------------------------- IF NOTEXISTS (SELECT * from sys. databases wherename= 'db_test') BEGIN CREATE DATABASE db_test; END -- Establecemos la basede datos predeterminada USE db_test; -- --------------------------------------------------------------------
  • 5. 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 -- Creamos una tabla si no existiese. -- Representa los datos de expedientes -- -------------------------------------------------------------------- IF NOTEXISTS (SELECT * FROM sys. sys. objects WHEREname='expedie ntes' AND xtype='U') BEGIN CREATE TABLE expedientes ( code VARCHAR(15) NOT NULL, state VARCHAR(20) DEFAULT 'INICIO', stateChangedDate DATETIME, PRIMARY KEY (code) ); END; -- Insertamos algunos expedientes de ejemplo DELETE FROM expedientes WHERE code IN('exp1','exp2', 'exp3'); INSERT INTO expedientes (code) VALUES ('exp1'); INSERT INTO expedientes (code) VALUES ('exp2'); INSERT INTO expedientes (code) VALUES ('exp3'); -- Si no existe la tabla de cambios de esstado la creamos IF NOTEXISTS (SELECT * FROM sys. sys. objects WHEREname='expStat usHistory' AND xtype='U') BEGIN CREATE TABLE expStatusHistory ( id INT IDENTITY, code VARCHAR (15) NOTNULL, state VARCHAR(20) NOTNULL, date DATETIME DEFAULT GetDate (), PRIMARY KEY (id) ); END; -- Borramos el Triggers siexistise IF OBJECT_ID ('StatusChangeDateTrigger', 'TR') IS NOTNULL BEGIN DROP TRIGGERStatusChangeDateTrigger; END;
  • 6. 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 GO -- Necesario -- Cremamos un Triggers sobrela tabla expedientes CREATE TRIGGERStatusChangeDateTrigger ON expedientes AFTER UPDATE AS -- ¿Ha cambiado el estado? IF UPDATE(state) BEGIN -- Actualizamos el campo stateChangedDate a la fecha/hora actu al UPDATEexpedientes SET stateChangedDate=GetDate () WHERE code= (SELECT code FROM inserted); -- A modo de auditoría, añadimos un registro en la tabla expStatusHi story INSERTINTO expStatusHistory (code, state) (SELECTcode, state FROM deleted WHEREcode=deleted. code); -- La tabla deleted contiene información sobrelos valores ANTIGUOS mientras que la tabla inserted contiene los NUEVOS valores. -- Ambas tablas son virtuales y tienen la misma estructura que la tab la a la que se asocia el Trigger. END;