ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Disparador


Enviado por   •  19 de Mayo de 2014  •  1.890 Palabras (8 Páginas)  •  153 Visitas

Página 1 de 8

1 Trigger (Disparador)[modifica]

Un disparador (trigger) és un objecte amb nom al qual s'associa amb una taula i s'activa cuand es produeix un event.

Por exemple, creem una taula i un disparador para sentencies INSERT dins de la taula. El disparador suma els valors insertats en una de les columnes de la taela:

1

2

3

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account

-> FOR EACH ROW SET @sum = @sum + NEW.amount;

1.1 Sintaxi de CREATE TRIGGER[modifica]

1

2

CREATE TRIGGER nom_disp moment_disp event_disp

ON nom_taula FOR EACH ROW sentència_disp

El disparador queda associat a una taula nom_taula.

moment_disp és el moment en el que el disparador entra en acció. Pot ser BEFORE (abans) o AFTER (després), indica que el disparador s'executi abans o després que la sentencia que l'activa.

event_disp indica la classe de sentencia que activa al disparador. Pot ser INSERT, UPDATE, o DELETE.

No poden haber-hi dos disparadors en una mateixa taula que corresponguin al mateix moment i sentencia. Per exemple, no es poden tenir dos disparadors BEFORE UPDATE. Però sí es possible tenir els disparadors BEFORE UPDATE i BEFORE INSERT o BEFORE UPDATE i AFTER UPDATE.

sentencia_disp és la sentencia que s'executa al activar el disparador. Si es desitgen executar múltiples sentencies, s'ha de fer servir BEGIN ... END, el constructor de sentencies compostes.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

CREATE TABLE test1(a1 INT);

CREATE TABLE test2(a2 INT);

CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);

CREATE TABLE test4(

a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

b4 INT DEFAULT 0

);

DELIMITER |

CREATE TRIGGER testref BEFORE INSERT ON test1

FOR EACH ROW BEGIN

INSERT INTO test2 SET a2 = NEW.a1;

DELETE FROM test3 WHERE a3 = NEW.a1;

UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;

END

|

DELIMITER ;

INSERT INTO test3 (a3) VALUES

(NULL), (NULL), (NULL), (NULL), (NULL),

(NULL), (NULL), (NULL), (NULL), (NULL);

INSERT INTO test4 (a4) VALUES

(0), (0), (0), (0), (0), (0), (0), (0), (0), (0);

Si a la taula test1 s'insereixen els valores:

1

2

3

4

mysql> INSERT INTO test1 VALUES

-> (1), (3), (1), (7), (1), (8), (4), (4);

Query OK, 8 rows affected (0.01 sec)

Records: 8 Duplicates: 0 Warnings: 0

Les dades en les 4 taules quedarien així:

1

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

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

mysql> SELECT * FROM test1;

+------+

| a1 |

+------+

| 1 |

| 3 |

| 1 |

| 7 |

| 1 |

| 8 |

| 4 |

| 4 |

+------+

8 rows in set (0.00 sec)

mysql> SELECT * FROM test2;

+------+

| a2 |

+------+

| 1 |

| 3 |

| 1 |

| 7 |

| 1 |

| 8 |

| 4 |

| 4 |

+------+

8 rows in set (0.00 sec)

mysql> SELECT * FROM test3;

+----+

| a3 |

+----+

| 2 |

| 5 |

| 6 |

| 9 |

| 10 |

+----+

5 rows in set (0.00 sec)

mysql> SELECT * FROM test4;

+----+------+

| a4 | b4 |

+----+------+

| 1 | 3 |

| 2 | 0 |

| 3 | 1 |

| 4 | 2 |

| 5 | 0 |

| 6 | 0 |

| 7 | 1 |

| 8 | 1 |

| 9 | 0 |

| 10 | 0 |

+----+------+

10 rows in set (0.00 sec)

Les columnes de la taula associada amb el disparador es poden referenciar amb OLD i NEW. OLD.nom_col fa referencia a una columna de una fila existent, abans de ser actualitzada o esborrada. NEW.nom_col fa referencia a una columna en una nova fila a punt de ser inserida, o en una fila existent després de ser actualitzada.

L'uso de SET NEW.nom_col = valor es necessita el privilegi UPDATE sobre la columna. L'uso de SET nom_var = NEW.nom_col es necessita el privilegi SELECT sobre la columna.

1.2 Sintaxis de DROP TRIGGER[modifica]

1

DROP TRIGGER [nom_esquema.]nom_disp

Elimina un disparador. El nom d'esquema és opcional. Si l'esquema no es posa, el disparador s'elimina en l'esquema actual.

Amb versions inferiors a 5.0.10 de MySQL, es requería el nom de taula en lloc del nom de l'esquema.

1.3 Ús[modifica]

Aquí tenim un exemple que associa un disparador amb una taula per a que quan rebi sentencies INSERT, el qual acumula la suma dels valors insertats en una de les columnes de la taula.

La següent sentencia crea la taula i un disparador associat a ella:

1

2

3

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account

-> FOR EACH ROW SET @sum = @sum + NEW.amount;

La sentencia CREATE TRIGGER crea un disparador llamado ins_sum que se asocia con la tabla account. También se incluyen cláusulas que especifican el momento de activación, el evento activador, y qué hacer luego de la activación:

La

...

Descargar como (para miembros actualizados) txt (11 Kb)
Leer 7 páginas más »
Disponible sólo en Clubensayos.com