MySQL: возможная проблема времени жизни переменной, возможная проблема области, честно не уверен - PullRequest
0 голосов
/ 12 марта 2020

Итак, недавно унаследованный проект, настолько старый, что никто, кто был вовлечен в него, больше не работает в этой компании, в этом проекте есть база данных, и в этой базе данных у меня есть несколько таблиц:

TableA: userID | attrA | attrB | ... | role | flag | TableB: parent | child |
             1 |     A |     B | ... |    1 |    1 |              1 |     2 |
          etc.                                                    1 |     3 |
                                                                  2 |     5 |
                                                                  5 |    17 |

(Никогда видел это в реляционной базе данных раньше, но увы)
Итак, написал запрос, очень похожий на этот (MySQL 5.7):

SELECT
    @parents := user.userID as ID,
    user.attrA as A,
    user.attrB as B,
    IFNULL(
        (SELECT @parents AS inner
        FROM (SELECT parent, child FROM TableB ORDER BY child, parent) roles
        WHERE FIND_IN_SET(parent, @parents)
        AND @parents := IF(FIND_IN_SET(child, @parents), @parents, CONCAT(@parents, ',', child))
        ORDER BY inner DESC LIMIT 1),
        @parents
    ) AS roles
FROM TableA WHERE userID = ? AND flag = 1

В результате получается что-то вроде

ID | A | B | roles
 1 | A | B | 1,2,3,5,17

Который вызывается сервером. Теперь, вот серия событий, которые развернулись: написать запрос, протестировать его, работает идеально и согласованно, больше ничего не добавлять, выключить компьютер, на следующий день, загрузить компьютер, запустить сервер, запрос больше не работает на сервере. Внутренний запрос будет ... Ну, я не знаю, что он делает. Он всегда дает мне роли == ID, но удаление функции IFNULL не меняет этого факта, я думал, что это может быть потому, что ID был int, преобразование в char также ничего не меняет. Кроме того, выполнение запроса вручную через командную строку и через интерфейс по-прежнему работает идеально каждый раз. Я возился дальше, и получается, что если я выполню запрос дважды, прежде чем использовать его на стороне сервера, во второй раз он работает.

Итак, учитывая, что я сделал ровно ноль изменений в кодовой базе между тем, чтобы она работала, а она нет, я понятия не имею, с чего бы вообще начать пытаться это выяснить. Я бы предположил, что у меня есть проблема с областью действия или временем жизни, из-за которой переменная @parents перезаписывается или обнуляется, или что-то в этом роде, но ... Я имею в виду, опять же, она работает везде, где я пытался ее использовать. Надежды на проблему очевидны, и кому-то еще будет легко указать на это.

Приветствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...