Napisałem procedurę która rozdziela rekordy do dwu tabel z datą przed i po godzinie 15.00.
Ponieważ czynność ta potrzebna jest dwa razy dziennie chciałem uruchomić procedurę po zdarzeniu after insert,update lub delete.
Procedura i trigger działają, niestety próba wywołania procedury (call procedura) po zdarzeniach jw w bazie matce kończą się błędem.
Error Code: 1422. Explicit or implicit commit is not allowed in stored function or trigger.
procedura :
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_update_test`()
MODIFIES SQL DATA
BEGIN
TRUNCATE game_14;
INSERT INTO game_14 (Select NULL, Id,Date,L1,L2,L3,L4,L5 FROM game_mm WHERE time(Date)<'15:00:00');
TRUNCATE game_21;
INSERT INTO game_21 (Select NULL, Id,Date,L1,L2,L3,L4,L5 FROM game_mm WHERE time(Date)>'15:00:00');
SET @id=0;
UPDATE ms.game_14
SET
id = (SELECT (@id:=@id + 1))
WHERE
1;
SET @id=0;
UPDATE ms.game_21
SET
id = (SELECT (@id:=@id + 1))
WHERE
1;
END
trigger onAfter Insert :
CREATE DEFINER=`root`@`localhost` TRIGGER `ms`.`game_mm_AFTER_INSERT` AFTER INSERT ON `game_mm` FOR EACH ROW
BEGIN
call ms.sp_update_test();
END
jeszcze struktura (wszystkie trzy tabele maja tę samą strukturę :
CREATE TABLE `game_mm` (
`RecordId` int(11) NOT NULL AUTO_INCREMENT,
`Id` int(11) DEFAULT NULL,
`DATE` datetime DEFAULT NULL,
`L1` smallint(6) DEFAULT NULL,
`L2` smallint(6) DEFAULT NULL,
`L3` smallint(6) DEFAULT NULL,
`L4` smallint(6) DEFAULT NULL,
`L5` smallint(6) DEFAULT NULL,
PRIMARY KEY (`RecordId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Trigger :
CREATE DEFINER=`root`@`localhost` TRIGGER `ms`.`game_mm_AFTER_INSERT` AFTER INSERT ON `game_mm` FOR EACH ROW
BEGIN
call ms.sp_update_test();
END
typowy INSERT wywołujący trigger:
INSERT INTO ms.game_mm VALUES
(NULL,9,'2018-12-05 14:00:00',5,14,23,24,25),
(NULL,10,'2018-12-05 21:00:00',5,21,33,34,35);
Alternnatywnym rozwiązaniem jest wywołanie procedury w konsoli MYSQL wołane z Crona ale Trigger wydawałł się bardziej eleganckim. W konsoli i z crona działa z triggera niestety nie.
pozdr
AK