Pràctica sobre la teoria. Disparadors / triggers a MySQL

De wikijoan
Salta a la navegació Salta a la cerca

Introducció

NOTA. Per crear triggers (igual que passava amb les functions) s'ha de tenir permisos de SUPER. Evidentment l'usuari root té aquests permisos, i per tant pots crear els teus triggers amb l'usauri root. Si vols crear els triggers amb l'usuari alumne se li han d'atorgar els permisos:

mysql> GRANT SUPER ON *.* TO alumne@localhost

(aquesta sentència s'ha d'executar des de l'usuari root, evidentment). Per crear procediments això no era necessari.

Els exercicis que s'han de realtizar són els que s'han explicat a la teoria:

Tasques a realitzar

NOTA: en tots els exercicis has de personalitzar amb el teu nom la sortida per pantalla. Dues idees:

CREATE TABLE pepito_salaries ...
CONCAT('Pepito: ', 'No podem incrementar el salari més del 10%')

Exercici 1: creació d'un trigger

Utilitzem la base de dades classicmodels, que és on hi ha la taula employees.

CREATE TABLE employees_audit
CREATE TRIGGER before_employee_update 

Exercici 2: creació d'un trigger

CREATE TABLE billings (
CREATE TRIGGER before_billing_update

Fer un insert sobre la taula billings, i fer dos updates: el primer que la quantitat no sigui superior a 10 vegades el amount; i el segon que sí que superi 10 vegades el amount, per veure com s'aixeca la SIGNAL i així s'avorta el update.

Exercici 3: Before insert trigger

CREATE TABLE WorkCenters (
CREATE TABLE WorkCenterStats(
CREATE TRIGGER before_workcenters_insert

Fer 3 ó 4:

INSERT INTO WorkCenters(name, capacity)

i veure com la capacitat s'acumula en la taula WorkCenterStats.

Exercici 4: After insert trigger

CREATE TABLE members (
CREATE TABLE reminders (
CREATE TRIGGER after_members_insert

INSERT INTO members(name, email, birthDate)
VALUES
    ('John Doe', 'john.doe@example.com', NULL),
    ('Jane Doe', 'jane.doe@example.com','2000-01-01');

Exercici 5: Before update trigger

CREATE TABLE sales (

INSERT INTO sales(product, quantity, fiscalYear, fiscalMonth)
VALUES
    ('2003 Harley-Davidson Eagle Drag Bike',120, 2020,1),
    ('1969 Corvair Monza', 150,2020,1),
    ('1970 Plymouth Hemi Cuda', 200,2020,1);

CREATE TRIGGER before_sales_update

UPDATE sales SET quantity = 150 WHERE id = 1;
UPDATE sales SET quantity = 500 WHERE id = 1;

SHOW ERRORS;

Exercici 6: After update trigger

CREATE TABLE Sales (

INSERT INTO Sales(product, quantity, fiscalYear, fiscalMonth)
VALUES
    ('2001 Ferrari Enzo',140, 2021,1),
    ('1998 Chrysler Plymouth Prowler', 110,2021,1),
    ('1913 Ford Model T Speedster', 120,2021,1);

CREATE TABLE SalesChanges (

CREATE TRIGGER after_sales_update

UPDATE Sales SET quantity = 350 WHERE id = 1;
UPDATE Sales SET quantity = CAST(quantity * 1.1 AS UNSIGNED);

Exercici 7: Before delete trigger

CREATE TABLE Salaries (

INSERT INTO salaries(employeeNumber,validFrom,amount)
VALUES
    (1002,'2000-01-01',50000),
    (1056,'2000-01-01',60000),
    (1076,'2000-01-01',70000);

CREATE TABLE SalaryArchives (

CREATE TRIGGER before_salaries_delete

DELETE FROM salaries WHERE employeeNumber = 1002;

SELECT * FROM SalaryArchives; 

Exercici 8: After delete trigger

CREATE TABLE Salaries (

INSERT INTO Salaries(employeeNumber,salary)
VALUES
    (1002,5000),
    (1056,7000),
    (1076,8000);

CREATE TABLE SalaryBudgets(

mirar bé aquesta sentència, que no estàs acostumat a fer-ho d'aquesta manera:
INSERT INTO SalaryBudgets(total)
SELECT SUM(salary) 
FROM Salaries;

CREATE TRIGGER after_salaries_delete

DELETE FROM Salaries WHERE employeeNumber = 1002;

SELECT * FROM SalaryBudgets;  

Exercici opcional (entrega apart): Crear múltiples triggers

Aquest exercici l'hem explicat a classe.

Has de mirar l'exemple amb deteniment, per entendre bé allò que fa.

Entregaràs l'evidència de que has realitzat l'exercici. I faràs una explicació amb les teves paraules del funcionament.

Entrega

Entregaràs un pdf amb captures de pantalla per demostrar que els exercicis els has fet en la teva màquina de forma individual (que no vol dir que no es pugui treballar per parelles).

També pots entregar un fitxer de text amb caputres de pantalla adjuntes.

En el codi hi ha d'haver l'evidència de què has modificat el codi (posar el teu nom dins del codi, per exemple, pepito).


creat per Joan Quintana Compte, maig 2022