пʼятниця, 11 грудня 2015 р.

Тригеры в MySQL

Пришлось как то мне заниматься "свадебкой" - подружить Asterisk с UTM5 (биллинговая система). После нескольких безсонных ночей, мне все таки удалось кое как заставить работать эти системы вместе, но был один существенный недостаток в этой связке. Хотя Asterisk и отдавал данные в UTM5, но обратной связи он не имел с биллинговой системой. Что было очень неудобно, так как приходилось фактически вести две конфигурации, после того как в UTM5 например добавлялся новый абонент, его нужно было переносить руками в конфигурацию Asterisk… Что в конечном итоге могло создать кучу проблем и постоянно нужно было следить за тем что бы конфигурации были одинаковы. Так как базы оба продукта хранили в MySQL, то первое что мне пришло в голову, это использовать тригеры для синхронизации конфигураций. Конечно настроить Asterisk что бы он работал с базой, было еще той задачей, так как я раньше не видел это чудо, только слышал, что есть такой продукт.
Сообственно об этом я расскажу как то в другой раз, думаю это не последняя статья на телефонную тематику у меня :)
Немножко посмотрел документацию по MySQL и приступил, что тут может быть сложного то… сделать три тригера, на вставку, обновление и удаление записи в таблице:
-- Insert peer --
CREATE TRIGGER tel_add AFTER INSERT ON tel_numbers 
  FOR EACH ROW BEGIN 
    INSERT INTO tel_peers SET 
    id = NEW.id, name = NEW.login, 
    callerid = NEW.tel_number, md5secret = MD5(CONCAT(NEW.login,':',NEW.allowed_cid,':',NEW.password)); 
  END;

-- Update peer --
CREATE TRIGGER tel_update AFTER UPDATE ON tel_numbers 
  FOR EACH ROW BEGIN 
    UPDATE tel_peers SET 
    name = NEW.login, 
    callerid = NEW.tel_number, 
    md5secret = MD5(CONCAT(NEW.login,':',NEW.allowed_cid,':',NEW.password)) 
    WHERE id = NEW.id; 
  END;

-- Delete peer --
CREATE TRIGGER tel_del AFTER DELETE ON tel_numbers 
  FOR EACH ROW BEGIN 
    DELETE FROM tel_peers WHERE id = NEW.id; 
  END;
Но как оказалось, UTM5 не удаляет данные когда в GUI нажимаешь кнопку удалить, в таблице есть отдельное поле с признаком того что запись удалена (я так понимаю для того что бы была возможность просмотреть старые записи). Пришлось мне переделывать тригер на обновление, а на удаление просто выбросить.
-- Update peer --
CREATE TRIGGER tel_update AFTER UPDATE ON tel_numbers 
  FOR EACH ROW 
  BEGIN
    IF (OLD.is_deleted = 0 AND NEW.is_deleted = 1) THEN 
      BEGIN
        DELETE FROM tel_peers WHERE id = NEW.id;
      END;
    ELSE 
      BEGIN
        UPDATE tel_peers SET 
        name = NEW.login, 
        callerid = NEW.tel_number, 
        md5secret = MD5(CONCAT(NEW.login,':',NEW.allowed_cid,':',NEW.password)) 
        WHERE id = NEW.id;
      END;
    END IF;
  END;
Конечно это все наверное можно как то более изящно переписать, но так как я не сильно большой специалист в SQL, для решения моей задачи достаточно :)

Немає коментарів:

Дописати коментар