Aqui , há uma amostra de um gatilho com a cláusula "INSTEAD OF UPDATE":
CREATE TRIGGER [dbo].[Test_PTA_Table_Update_trg]
-- ALTER TRIGGER [dbo].[Test_PTA_Table_Update_trg]
ON [dbo].[Test_PTA_Table]
INSTEAD OF UPDATE
AS
SET NOCOUNT ON
DECLARE @key int
SET @key = (SELECT TestTablePK FROM Inserted)
UPDATE Test_PTA_Table
SET DateEnd = GetDate(), DateReplaced = GetDate()
WHERE TestTablePK = @key
INSERT INTO dbo.Test_PTA_Table
(TestTableText, DateCreated, DateEffective, OperatorCode, DateReplaced)
(SELECT TestTableText, GetDate(), GetDate(), OperatorCode, NULL
FROM Inserted)
Estou tentando portar o princípio para o MySQL:
DELIMITER ;;
DROP TRIGGER IF EXISTS attribut_trigger_update_before;
CREATE TRIGGER attribut_trigger_update_before
BEFORE UPDATE ON attribut
FOR EACH ROW BEGIN
INSERT INTO attribut SET
id_origine = OLD.id_origine,
date_v_creation = OLD.date_v_creation,
date_v_debut = OLD.date_v_debut,
date_v_fin = OLD(),
importance = OLD.importance,
description = OLD.description,
valeur = OLD.valeur,
abbreviation = OLD.abbreviation;
END;;
DELIMITER ;;
Mas não funciona.
mysql> update produit set importance=3;
ERROR 1442 (HY000): Can't update table 'produit' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
mysql>
Alguma idéia de como fazer isso?
Isso já foi discutido antes por outros
Sua pergunta é um pouco diferente neste caso. Você pode ter que experimentar
INSERT IGNORE
ouREPLACE
para obter o efeito desejado.Você também pode precisar experimentar desabilitar o gatilho no meio do caminho: Desabilitar o gatilho para apenas uma tabela