Выпуск Freeradius версии 2.2.8 sql - PullRequest
1 голос
/ 20 марта 2019
Error: [sql] Couldn't insert SQL accounting START record - Can't update table 'useraccounting' in stored function/trigger because it is already used by statement which invoked this stored function/trigger

Мы часто получаем вышеуказанную ошибку после аутентификации пользователя, и пользователю требуется более 1 минуты, чтобы появиться в онлайн-таблице.Любая идея о причине и решениях?

Спасибо

Обновление: ниже используемого триггера:

    CREATE DEFINER=`mysql`@`%` TRIGGER `radacct_after_update` AFTER UPDATE ON `radacct` FOR EACH ROW BEGIN
  if (NEW.acctoutputoctets != OLD.acctoutputoctets)
  THEN
    UPDATE useraccounting SET tmpQuta = tmpQuta + (New.acctoutputoctets - OLD.acctoutputoctets)
    WHERE EXISTS (SELECT * FROM users WHERE users.userable_id = useraccounting.client_id AND users.userable_type = 'App\\Models\\Client' AND (users.username = New.username));
  END IF;
END

ОБНОВЛЕНИЕ2: мы создали 2 триггера.Один на INSERT и другой на UPDATE.

После INSERT на radacct:

BEGIN
    UPDATE useraccounting SET tmpQuta = New.acctoutputoctets
       WHERE EXISTS (SELECT * FROM users WHERE users.userable_id = useraccounting.client_id AND users.userable_type = 'App\\Models\\Client' AND (users.username = New.username));
END

после UPDATE на radacct:

BEGIN
  if (NEW.acctoutputoctets != OLD.acctoutputoctets)
  THEN
    UPDATE useraccounting SET tmpQuta = tmpQuta + (New.acctoutputoctets - OLD.acctoutputoctets)
    WHERE EXISTS (SELECT * FROM users WHERE users.userable_id = useraccounting.client_id AND users.userable_type = 'App\\Models\\Client' AND (users.username = New.username));
  END IF;
END
...