MySQL - Trigger After Delete activado On delete cascada

 
Vista:
sin imagen de perfil
Val: 8
Ha aumentado su posición en 9 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Trigger After Delete activado On delete cascada

Publicado por Giannino (3 intervenciones) el 08/10/2020 05:23:25
Hola Amigos
Quisiera saber si un trigger After Delete se ejecuta si los registros son borrados por un foreing Key On Delete Cascade?

Estoy trabajando con mysql 8 y al borrar un documento, los detalles de estos no me estan disparando el trigger after delete, la tabla detalles tiene un foreing key On delete Cascade contra la tabla de documentos. (al borrar el documento se eliminan todos sus detalles.

sin embargo al hacerlo manual desde la tabla de detalles si se ejecuta.


Gracias de antemano por la ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Francisco
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Trigger After Delete activado On delete cascada

Publicado por Francisco (73 intervenciones) el 08/10/2020 19:36:04
Hola

Lamento decirte que los triggers no se activan si hay acciones ON DELETE ON UPDATE sobre la clave foranea, en ninguna version de MySQL

https://dev.mysql.com/doc/refman/8.0/en/stored-program-restrictions.html

Restrictions for Triggers
For triggers, the following additional restrictions apply:

Triggers are not activated by foreign key actions.

When using row-based replication, triggers on the replica are not activated by statements originating on the source. The triggers on the replica are activated when using statement-based replication. For more information, see Section 17.5.1.35, “Replication and Triggers”.

The RETURN statement is not permitted in triggers, which cannot return a value. To exit a trigger immediately, use the LEAVE statement.

Triggers are not permitted on tables in the mysql database. Nor are they permitted on INFORMATION_SCHEMA or performance_schema tables. Those tables are actually views and triggers are not permitted on views.

The trigger cache does not detect when metadata of the underlying objects has changed. If a trigger uses a table and the table has changed since the trigger was loaded into the cache, the trigger operates using the outdated metadata.


Test Code
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
59
60
61
62
63
64
65
66
67
68
SELECT version() AS 'mysql version';
 
 
drop table IF EXISTS hijos;
drop table IF EXISTS padres;
drop table IF EXISTS logger;
 
Create table logger (
	id Int NOT NULL AUTO_INCREMENT,
	name Varchar(100) NOT NULL,
	Index AI_id (id),
 Primary Key (id)) ENGINE = InnoDB;
 
 
Create table padres (
	id Int NOT NULL AUTO_INCREMENT,
	name Varchar(100) NOT NULL,
	Index AI_id (id),
 Primary Key (id)) ENGINE = InnoDB;
 
Create table hijos (
	id Int NOT NULL AUTO_INCREMENT,
	name Varchar(100) NOT NULL,
	padre_id Int NOT NULL,
 Primary Key (id)) ENGINE = InnoDB;
 
 
Alter table hijos add Constraint R001 Foreign Key (padre_id)
     references padres (id) on delete cascade on update cascade;
 
 
INSERT INTO padres(name) VALUES ('mama');
INSERT INTO padres(name) VALUES ('papa');
INSERT INTO padres(name) VALUES ('otro1');
INSERT INTO padres(name) VALUES ('otro2');
 
INSERT INTO hijos(name, padre_id) VALUES ('hijo1', 1);
INSERT INTO hijos(name, padre_id) VALUES ('hijo2', 1);
INSERT INTO hijos(name, padre_id) VALUES ('hijo3', 1);
INSERT INTO hijos(name, padre_id) VALUES ('hijo4', 2);
INSERT INTO hijos(name, padre_id) VALUES ('hijo5', 2);
INSERT INTO hijos(name, padre_id) VALUES ('hijo6', 2);
INSERT INTO hijos(name, padre_id) VALUES ('hijo7', 3);
INSERT INTO hijos(name, padre_id) VALUES ('hijo8', 3);
INSERT INTO hijos(name, padre_id) VALUES ('hijo9', 3);
 
DROP TRIGGER IF EXISTS delete_en_hijos;
 
DELIMITER ;;
 
CREATE TRIGGER delete_en_hijos
BEFORE DELETE
   ON hijos FOR EACH ROW
BEGIN
    INSERT INTO logger(name) VALUES ('Ejecutando trigger AFTER DELETED desde hijos');
END;
 
;;
DELIMITER ;
 
 
DELETE FROM padres where id = 3;
 
SELECT * FROM padres;
SELECT * FROM hijos;
 
-- Si muestra  un registro entonces el trigger se ejecuto
SELECT * FROM logger;

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 9 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Trigger After Delete activado On delete cascada

Publicado por Giannino (3 intervenciones) el 09/10/2020 00:07:58
Muchas gracias Francisco.
Me iré por la versión larga, borrare a través de la sentencia DELETE los registros en cada una de las tablas dependientes.

Una pregunta por curiosidad es así también en POSTGRES y ORACLE ?

Gracias nuevamente por tu ayuda.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Francisco
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Trigger After Delete activado On delete cascada

Publicado por Francisco (73 intervenciones) el 09/10/2020 18:26:53
Hola

En Postgres si ejecuta el trigger en la tabla detalle cuando eliminas el registro padre

Test Code

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
59
60
61
62
63
64
65
66
67
68
69
70
-PostgreSQL 9.6
--'\\' is a delimiter
 
select version() as postgresql_version;
 
drop table IF EXISTS hijos;
drop table IF EXISTS padres;
drop table IF EXISTS logger;
 
Create table logger (
	id bigserial NOT NULL,
	name Varchar(100) NOT NULL,
 Primary Key (id)
);
 
 
Create table padres (
	id bigserial NOT NULL ,
	name Varchar(100) NOT NULL,
 Primary Key (id));
 
Create table hijos (
	id bigserial NOT NULL,
	name Varchar(100) NOT NULL,
	padre_id Int NOT NULL,
 Primary Key (id)
);
 
 Alter table hijos add Constraint R001 Foreign Key (padre_id)
     references padres (id) on delete cascade on update cascade;
 
INSERT INTO padres(name) VALUES ('mama');
INSERT INTO padres(name) VALUES ('papa');
INSERT INTO padres(name) VALUES ('otro1');
INSERT INTO padres(name) VALUES ('otro2');
 
INSERT INTO hijos(name, padre_id) VALUES ('hijo1', 1);
INSERT INTO hijos(name, padre_id) VALUES ('hijo2', 1);
INSERT INTO hijos(name, padre_id) VALUES ('hijo3', 1);
INSERT INTO hijos(name, padre_id) VALUES ('hijo4', 2);
INSERT INTO hijos(name, padre_id) VALUES ('hijo5', 2);
INSERT INTO hijos(name, padre_id) VALUES ('hijo6', 2);
INSERT INTO hijos(name, padre_id) VALUES ('hijo7', 3);
INSERT INTO hijos(name, padre_id) VALUES ('hijo8', 3);
INSERT INTO hijos(name, padre_id) VALUES ('hijo9', 3);
 
DROP TRIGGER IF EXISTS delete_en_hijos ON hijos CASCADE;
 
CREATE OR REPLACE FUNCTION trigger_delete_en_hijos()
  RETURNS TRIGGER AS
$do$
BEGIN
    INSERT INTO logger(name) VALUES('Ejecutando trigger AFTER DELETED desde hijos');
    RETURN NEW;
END;
$do$
LANGUAGE plpgsql;
 
CREATE TRIGGER delete_en_hijos
    AFTER DELETE ON hijos
    FOR EACH ROW
    EXECUTE PROCEDURE trigger_delete_en_hijos();
 
DELETE FROM padres where id = 3;
 
SELECT * FROM padres;
SELECT * FROM hijos;
 
-- Si muestra  un registro entonces el trigger se ejecuto
SELECT * FROM logger;

Resultado
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
postgresql_version
1	PostgreSQL 9.6.2, compiled by Visual C++ build 1800, 64-bit
 
  	id	name
1	1	mama
2	2	papa
3	4	otro2
 
  	id	name	padre_id
1	1	hijo1	1
2	2	hijo2	1
3	3	hijo3	1
4	4	hijo4	2
5	5	hijo5	2
6	6	hijo6	2
 
  	id	name
1	1	Ejecutando trigger AFTER DELETED desde hijos
2	2	Ejecutando trigger AFTER DELETED desde hijos
3	3	Ejecutando trigger AFTER DELETED desde hijos

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 9 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Trigger After Delete activado On delete cascada

Publicado por Giannino (3 intervenciones) el 09/10/2020 18:40:02
Gracias por tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar