Биллинговая система Nodeny

Главная категория => Nodeny Plus => Тема начата: Warlock от 28 Июня 2022, 15:05:03



Название: mysql8 vs tmppays
Отправлено: Warlock от 28 Июня 2022, 15:05:03
приветствую всех. есть такая проблема.
в kerner/tmppays.cfg есть значение balance_finishes_service => 1.
с mysql 5.5 все отлично работает, но вот с 8-ой версией не хочет. Вот что пишет:
Код:
The target table v_services of the UPDATE is not updatable 

{
  'sql' => 'UPDATE v_services SET tags=CONCAT(tags,\',end_now,\') WHERE price>0 AND uid=?',
  'param' => [
    570
  ]
};
 
 UPDATE v_services SET tags=CONCAT(tags,',end_now,') WHERE price>0 AND uid='570'
Кто знает как можно исправить, чтоб работало?


Название: Re: mysql8 vs tmppays
Отправлено: Efendy от 02 Июля 2022, 07:37:46
Попробуй пересоздать вьюху с алгоритмом UNDEFINED
Код:
DROP VIEW IF EXISTS v_services;
CREATE ALGORITHM= UNDEFINED VIEW v_services AS
    SELECT u.*, s.module, s.category, s.title, s.description, s.plain_description,
        s.grp_list, s.price, s.auto_renew, s.no_renew, s.param
    FROM users_services u LEFT JOIN services s ON u.service_id = s.service_id;


Название: Re: mysql8 vs tmppays
Отправлено: Warlock от 02 Июля 2022, 20:19:51
Спасибо, попробую. А это можно делать на рабочей системе, или лучше тормознуть ядро и запущенные модули?


Название: Re: mysql8 vs tmppays
Отправлено: Cell от 03 Июля 2022, 08:29:58
делай на рабочей, потом все ребутнешь и все


Название: Re: mysql8 vs tmppays
Отправлено: Warlock от 04 Июля 2022, 22:13:04
Попробуй пересоздать вьюху с алгоритмом UNDEFINED
Код:
DROP VIEW IF EXISTS v_services;
CREATE ALGORITHM= UNDEFINED VIEW v_services AS
    SELECT u.*, s.module, s.category, s.title, s.description, s.plain_description,
        s.grp_list, s.price, s.auto_renew, s.no_renew, s.param
    FROM users_services u LEFT JOIN services s ON u.service_id = s.service_id;

Не помогло, такая же ошибка.


Название: Re: mysql8 vs tmppays
Отправлено: Warlock от 06 Июля 2022, 10:29:38
Может возможно каким-то образом апдейтить сразу users_services чтоб модуль работал корректно? А то вроде только избавился от дедлоков, вообще не очень хочется откатывать версию mysql.


Название: Re: mysql8 vs tmppays
Отправлено: Redmen от 06 Июля 2022, 12:37:34
https://dev.mysql.com/doc/refman/8.0/en/view-updatability.html (https://dev.mysql.com/doc/refman/8.0/en/view-updatability.html)

Цитировать
Іноді багатотабличне подання може бути оновлюваним, якщо припустити, що його можна обробити за допомогою MERGE алгоритму. Щоб це працювало, представлення має використовувати внутрішнє об’єднання (а не зовнішнє об’єднання чи UNION).
 ...
Перегляди, які використовують UNION ALL, заборонені, навіть якщо вони теоретично можуть бути оновлені.

для перевірки є запит:
Код:
SELECT `TABLE_SCHEMA`, `TABLE_NAME`, `IS_UPDATABLE` FROM `views` WHERE `TABLE_NAME` LIKE 'v_services';

LEFT JOIN => INNER JOIN

перевірив себе на тестовому - працює, але кількість виведених рядків не одинакова, тому треба більш детально досліджувати це питання

на прод не рекомендую)



Название: Re: mysql8 vs tmppays
Отправлено: Redmen от 06 Июля 2022, 13:29:15
Может возможно каким-то образом апдейтить сразу users_services чтоб модуль работал корректно? А то вроде только избавился от дедлоков, вообще не очень хочется откатывать версию mysql.

для tmppays.pm
Код:
UPDATE users_services u INNER JOIN services s ON (u.service_id = s.service_id) SET u.tags=CONCAT(u.tags,',end_now,') WHERE s.price>0 AND u.uid = ?

для balances.pm
Код:
UPDATE users_services u INNER JOIN services s ON (u.service_id = s.service_id) SET u.tags=CONCAT(u.tags,',end_now,'), u.next_service_id=0 WHERE s.price>0 AND u.uid = ?

але це не точно!)

ще є схоже в services/action.pm


Название: Re: mysql8 vs tmppays
Отправлено: Warlock от 07 Июля 2022, 08:12:34
а где-то ядром или какими-то модулями вьювы апдейтатся? а то вдруг там тоже ошибки, но я пока этого не заметил? просто может быть тогда в доке вместо рекомендаций установить mysql8 сделать предупреждение, что его не надо ставить? )


Название: Re: mysql8 vs tmppays
Отправлено: Warlock от 13 Июля 2022, 15:37:22
для tmppays.pm
Код:
UPDATE users_services u INNER JOIN services s ON (u.service_id = s.service_id) SET u.tags=CONCAT(u.tags,',end_now,') WHERE s.price>0 AND u.uid = ?

для balances.pm
Код:
UPDATE users_services u INNER JOIN services s ON (u.service_id = s.service_id) SET u.tags=CONCAT(u.tags,',end_now,'), u.next_service_id=0 WHERE s.price>0 AND u.uid = ?

але це не точно!)

ще є схоже в services/action.pm
Спасибо большое! так работает.
Ну а доку все-таки разработчику предлагаю подправить.


Название: Re: mysql8 vs tmppays
Отправлено: Efendy от 14 Августа 2022, 22:19:39
Запушил в next.