Capítulo 12: Desencadenadores

Base de datos de ejemplo

Creación:

DROP DATABASE IF EXISTS videoteca;
CREATE DATABASE videoteca;

Tablas:

USE videoteca;

CREATE TABLE interprete
(
  id INT NOT NULL AUTO_INCREMENT,
  nombre VARCHAR(64) NOT NULL,
  apellidos VARCHAR(64) NOT NULL,
  PRIMARY KEY(id)
)
ENGINE = InnoDB;

CREATE TABLE interprete_ext
(
  idinterprete INT NOT NULL,
  imdb VARCHAR(32) NOT NULL,
  carpeta VARCHAR(255) NOT NULL,
  PRIMARY KEY(idinterprete),
  INDEX ae_FK(idinterprete),
  FOREIGN KEY(idinterprete) REFERENCES interprete(id)
)
ENGINE = InnoDB;

Inserciones:

USE videoteca;

INSERT INTO interprete
(
  nombre,
  apellidos
)
VALUES
(
  'Harrison',
  'Ford'
);

INSERT INTO interprete
(
  nombre,
  apellidos
)
VALUES
(
  'Russell',
  'Crowe'
);

INSERT INTO interprete_ext
(
  idinterprete,
  imdb,
  carpeta
)
VALUES
(
  1,
  'nm0000148',
  'harrison_ford'
);

INSERT INTO interprete_ext
(
  idinterprete,
  imdb,
  carpeta
)
VALUES
(
  2,
  'nm0000128',
  'russell_crowe'
);

Desencadenador de inserción

USE videoteca;

DELIMITER //

CREATE TRIGGER dc_interprete_insertar
AFTER INSERT ON interprete
FOR EACH ROW BEGIN

DECLARE nuevo_carpeta VARCHAR(255);

SET nuevo_carpeta = CONCAT
(
  LOWER(NEW.nombre),
  '_',
  LOWER(NEW.apellidos)
);

INSERT INTO interprete_ext
(
  idinterprete,
  imdb,
  carpeta
)
VALUES
(
  NEW.id,
  '',
  nuevo_carpeta);

END

//
DELIMITER ;

Inserción de un nuevo intérprete:

USE videoteca;

INSERT INTO interprete
(
  nombre,
  apellidos
)
VALUES
(
  'Tim',
  'Robins'
);

Desencadenador de actualización

USE videoteca;

DELIMITER //

CREATE TRIGGER dc_interprete_actualizar
AFTER UPDATE ON interprete
FOR EACH ROW BEGIN

DECLARE nuevo_carpeta VARCHAR(255);

SET nuevo_carpeta = CONCAT(
  LOWER(NEW.nombre),
  '_',
  LOWER(NEW.apellidos)
);

UPDATE
  interprete_ext
SET
  carpeta = nuevo_carpeta
WHERE
  idinterprete = NEW.id;

END

//
DELIMITER ;

Cambiar el nombre del intérprete:

USE videoteca;

UPDATE
  interprete
SET
  apellidos = 'Robbins'
WHERE
  id = 3;

Borrado

USE videoteca;

DELIMITER //

CREATE TRIGGER dc_interprete_eliminar
BEFORE DELETE ON interprete
FOR EACH ROW BEGIN

DELETE FROM
  interprete_ext
WHERE
  idinterprete = OLD.id;

END

//
DELIMITER ;

Borrar un interprete:

USE videoteca;

DELETE FROM
  interprete
WHERE
  id = 3;
Anuncios