Problema con trigger al actualizar la misma tabla

publicado por: Anonymous

No puedo conseguir que a través de la Base de Datos MySQL pueda controlar que se inserte todo en mayúsculas, o actualizar después de insertar.

Tengo el siguiente trigger en la tabla paises(idPasi, pais):

CREATE DEFINER = CURRENT_USER TRIGGER `tf-modelo-de-datos`.`paises_AFTER_INSERT` AFTER INSERT ON `paises` FOR EACH ROW
BEGIN
    UPDATE tf.paises SET pais = UPPER(pais);
END

Pero al insertar un nuevo país me tira el siguiente error:

Operation failed: There was an error while applying the SQL script to
the database. Executing: INSERT INTO tf.paises (pais) VALUES
(‘Argentina’);

ERROR 1442: 1442: Can’t update table ‘paises’ in stored
function/trigger because it is already used by statement which invoked
this stored function/trigger. SQL Statement: INSERT INTO tf.paises
(pais) VALUES (‘Argentina’)

Leí algo de que se estaba tratando de modificar el mismo dato dos veces al mismo tiempo.

¿Alguien conoce alguna forma de hacer éste control de la forma más eficiente posible, pero a nivel de Base de Datos?.

solución

No puedes de ningún modo actualizar la misma tabla a la que afecta el trigger, por que esto generaría una recursión infinita. Pero lo que puedes hacer es, modificar la “pseudo” tabla NEW para ajustar el valor de la columna en cuestión, solo que debes hacerlo antes del INSERT, es decir colgarte del BEFORE INSERT.

Ejemplo:

DROP TABLE IF EXISTS Paises;

CREATE TABLE Paises (
  Nombre varchar(255)
);

CREATE TRIGGER trg_Paises BEFORE INSERT ON Paises
FOR EACH ROW BEGIN
    SET NEW.Nombre = UPPER(NEW.Nombre);
END
;

INSERT INTO Paises (Nombre) VALUE('argentina');

Aquí el Fiddle

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *