У меня есть две таблицы и триггер. Когда мы вставляем строку в одну таблицу, то запускаем вставку строки в другую таблицу.
дохода_multi_currency_test_init_script.sql:
CREATE TABLE `game_operation` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'GAME_OPERATION unique identifier',
`time` DATETIME NOT NULL COMMENT 'Time',
`total_bet` INT NOT NULL COMMENT 'Total bet of game operation',
`total_win` BIGINT NOT NULL COMMENT 'Total win of game operation, including bonus, excluding jackpot',
`balance` BIGINT DEFAULT 0 COMMENT 'Balance of game operation',
`result` TEXT COMMENT 'Detailed result of game round, serialized as text',
`game_session_id` BIGINT UNSIGNED NOT NULL COMMENT 'GAME_SESSION unique identifier during which operation is performed',
`start_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Unique identifier of GAME_OPERATION that started current bet session (paid game)',
PRIMARY KEY (`id`),
KEY `ix_game_operation_game_session_start_id` (`game_session_id`, `start_id`)
);
CREATE TABLE `game_operation_hourly` (
`id` BIGINT UNSIGNED NOT NULL COMMENT 'Composed value of (HOUR_NUMBER<<45) + (GAME_ID<<32) + PLAYER_ID, where HOUR_NUMBER = (HOUR - 2019-01-01 00:00:00 UTC)/60/60',
`hour` DATETIME NOT NULL COMMENT 'Timestamp when aggregated hour starts, inclusive',
`total_bet` BIGINT NOT NULL COMMENT 'Sum of bets in aggregated hour',
`total_win` BIGINT NOT NULL COMMENT 'Sum of wins in aggregated hour, including bonus, excluding jackpot',
`bet_count` INT NOT NULL COMMENT 'Count of operations in aggregated hour',
`game_id` INT NOT NULL COMMENT 'Unique identifier of game engine, defined in code',
`player_id` INT UNSIGNED NOT NULL COMMENT 'PLAYER unique identifier',
PRIMARY KEY (`id`),
KEY `ix_game_operation_hourly_hour_game_id` (`hour`, `game_id`),
KEY `ix_game_operation_hourly_hour_player_id` (`hour`, `player_id`)
);
DELIMITER //
CREATE TRIGGER game_operation_insert AFTER INSERT ON `game_operation`
FOR EACH ROW
BEGIN
IF NEW.total_bet != 0 OR NEW.total_win != 0 THEN
BEGIN
DECLARE l_player_id INT;
DECLARE l_game_id INT;
DECLARE l_hour_int INT;
DECLARE l_hour_date DATETIME;
DECLARE l_id BIGINT;
SELECT `player_id`, `game_id` INTO l_player_id, l_game_id FROM `game_session` WHERE `id` = NEW.game_session_id;
IF (l_player_id IS NULL OR l_game_id IS NULL) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Game session not found';
ELSEIF (l_game_id > 8191) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Parameter `game_id` is greater than 8191';
END IF;
SET l_hour_int := UNIX_TIMESTAMP(NEW.time) DIV 3600;
SET l_id := ((l_hour_int - 429528) << 45) | (l_game_id << 32) | (l_player_id);
SET l_hour_date := FROM_UNIXTIME(l_hour_int * 3600);
INSERT INTO `game_operation_hourly` (`id`, `hour`, `total_bet`, `total_win`, `bet_count`, `game_id`, `player_id`)
VALUES (l_id, l_hour_date, NEW.total_bet, NEW.total_win, IF(NEW.total_bet = 0, 0, 1), l_game_id, l_player_id)
ON DUPLICATE KEY UPDATE `total_bet`=`total_bet`+VALUES(`total_bet`), `total_win`=`total_win`+VALUES(`total_win`), `bet_count`=`bet_count`+VALUES(`bet_count`);
END;
END IF;
END//
DELIMITER ;
Все работает нормально в mySQL workBanch и вFlyWay sql файлы в проекте. Но когда я вставляю создание триггера в скрипт в моем тесте, он выдает ошибку
, вызванную: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который нужно использовать рядом с 'DELIMITER // CREATE TRIGGER game_operation_insert ПОСЛЕ INSERT ON `game_operatio' в строке 1
Я запускаю свой скрипт в тесте вот так:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(initializers = ReportApplicationTests.Initializer.class)
@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:db/migration/revenue_multi_currency_test_init_script.sql")
@Import(DataSourceAutoConfiguration.class)
Как создать триггер в тесте?