Вставьте значения в таблицу, используя триггер со значениями из хранимой процедуры - PullRequest
1 голос
/ 01 мая 2019

Я новичок здесь. Поэтому, пожалуйста, не стесняйтесь исправлять меня, если мой код или подход к мышлению могут быть обработаны.

Я работаю в MySQL Workbench и клиенте командной строки MySQL 8.0. У меня есть база данных под названием ds_testdb2 с ее таблицами структурирована следующим образом:

ds_testdb2

-Tables:

  1. asset_sensor_table

  2. device_table

  3. mapped_readings_table
  4. readings_table
  5. sensor_table

Мне нужно выполнять следующую инструкцию SELECT каждый раз, когда в мою readings_table вставляется запись (вставка в readings_table происходит примерно раз в 1 минуту). Этот оператор SELECT объединяет 4 таблицы и создает отображение imei устройства с другими атрибутами устройства, такими как device_id, subscription_id и т. Д., Из другой базы данных с именем agiletest . Этот оператор SELECT работает правильно.

SELECT r.imei, r.send_time, r.latitude, r.longitude, r.temperature, r.ground_velocity,
        d.sys_id  AS device_id, d.model_id, d.Subscription_ID,
        s.id AS sensor_id, s.type_id AS sensor_type,
        a_s.asset_id, a_s.start_time, a_s.end_time
        FROM 
        ds_testdb2.readings_table r JOIN agiletest.device d ON  r.imei= d.imei
        JOIN agiletest.sensor s ON d.sys_id= s.device_id 
        JOIN agiletest.asset_sensor a_s ON s.id= a_s.sensor_id; 

Итак, я поместил этот оператор SELECT в хранимую процедуру. Этот SP также работает правильно.

DELIMITER $$
CREATE PROCEDURE `ds_testdb2`.`mapping_2`()
    BEGIN
        INSERT INTO `ds_testdb2`.`mapped_readings_table`  -- mapped_readings-table already existed, but was empty.
        (`imei`, `send_time`, `latitude`, `longitude`,`temperature`,`ground_velocity`,
        `device_id`,`model_id`,`subscription_id`,
        `sensor_id`,`sensor_type`,
        `asset_id`,`start_time`,`end_time`) -- no 'VALUES' keyword      
        SELECT r.imei, r.send_time, r.latitude, r.longitude, r.temperature, r.ground_velocity,
        d.sys_id  AS device_id, d.model_id, d.Subscription_ID,
        s.id AS sensor_id, s.type_id AS sensor_type,
        a_s.asset_id, a_s.start_time, a_s.end_time
        FROM 
        ds_testdb2.readings_table r JOIN agiletest.device d ON  r.imei= d.imei
        JOIN agiletest.sensor s ON d.sys_id= s.device_id 
        JOIN agiletest.asset_sensor a_s ON s.id= a_s.sensor_id;    
    END  $$ 

Затем я запускаю хранимую процедуру:

mysql> call mapping_2;
Query OK, 4 rows affected (0.02 sec)

Теперь этот SP должен выполняться каждый раз, когда запись вставляется в мою readings_table. Итак, я создал триггер, который говорит:

mysql> DELIMITER $$
mysql> CREATE TRIGGER initial_table_mapping_1 AFTER INSERT ON readings_table
    -> FOR EACH ROW
    -> BEGIN
    -> call mapping_2();
    -> END $$
Query OK, 0 rows affected (0.04 sec) 

Теперь, чтобы проверить выполнение триггера, я делаю следующие шаги в MySQLWorkbench:

- Шаг 1. Вставьте 1 запись в readings_table

INSERT INTO readings_table -- (imei,send_time, latitude, longitude, temperature, ground_velocity)
VALUES
(354721090118251, '2019-04-07 21:26:48',43.63218, -79.51890, 108, 50);

Код ошибки: 1415. Не разрешено возвращать набор результатов из триггера.

- шаг 2. выполнить триггер
- уже запустил его в командной строке MySQL
-Ответ был: запрос в порядке, затронуто 0 строк (0,04 сек)

Шаг 3. проверить, обновлена ​​ли таблица mapped_readings_table (текущая # строка = 16)

select * from mapped_readings_table;   

- все еще застрял с ошибкой из шага 1.

У меня такой вопрос: на шаге 1 как я могу переписать свой триггер так, чтобы набор результатов из моей хранимой процедуры сохранялся в моей mapped_readings_table , каждый раз, когда запись вставлялась в мою readings_table ? И, мои шаги (Шаг 1,2,3), чтобы проверить выполнение моего триггера, правильно?

Аналогичный вопрос здесь: Обновление таблицы в триггере со значениями из хранимой процедуры

1 Ответ

0 голосов
/ 08 мая 2019

Вот решение: мой триггер выше сработал отлично и является правильным триггером для выполнения работы, которую я имел в виду.Проблема заключалась в том, что я создал много фиктивных триггеров, чтобы посмотреть, работает ли мой триггер.

Итак, ПОСЛЕ INSERT ON readings_table, выполнялись эти старые, фиктивные триггеры, а не последний.Проблема была решена после того, как я удалил старые триггеры и в моей системе был только правильный триггер.

...