• Почему не получаются значения NEW в триггере BEFORE UPDATE?

    @exotik997 Автор вопроса
    Akina,
    Есть таблица Договоров. Есть таблица Объектов. Как я понимаю, записи в каждой из таблиц создаются совершенно независимо. Однако в таблице Договоров есть поле связи/ссылки с Объектом (договор может ссылаться только на один Объект, или ни на один). Значение в этом поле может либо присваиваться в момент создания записи при INSERT, либо указываться в дальнейшем при UPDATE. По-моему, так.

    Скорее в таблице объектов есть поле связи. Назывется cid. Следовательно 1 объект может ссылаться на 1 договор. Много объектов так же могут ссылаться на 1 договор.

    На будущее рекомендация: если поле в таблице А ссылается на поле в таблице Б (пусть даже без внешнего ключа, клиентской логикой) - делайте этим полям абсолютно одинаковые имена, понятно, уникальные в пределах схемы. Потом проще разбираться. Да и синтаксис JOIN USING прозрачнее и понятнее, чем JOIN ON.


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

    Создаётся Договор - запись в таблице ???. В ней есть поле ???, которое может быть ссылкой на Объект. Сам объект хранится в таблице ???, соответствующее поле для связи ???. (для оставшихся двух таблиц) Таблица ??? содержит ??? для таблицы ???, связывание происходит по выражению ???.??? = ???.??? - вот как-то так.


    Создаётся Договор - запись в таблице contract. В ней есть поле (его нет), которое может быть ссылкой на Объект. Сам объект хранится в таблице object, соответствующее поле для связи cid. (для оставшихся двух таблиц) Таблицаphone_client_item_1 содержит cid и id для таблиц contract и phone_item_number_1, связывание происходит по выражениям
    contract.id = object.cid = phone_client_item_1.cid
    phone_client_item_1.object_id = object.id = object_param_value_text.object.id
    phone_client_item_1.id = phone_item_number_1.item_id


    Если в таблице Объект уже имеется запись, и в поле таблицы Договоров при вставке новой записи (INSERT) должна быть вставлена ссылка, то запись, из которой берётся значение для ссылки, берётся по выражению ???.??? = ???.???

    Если такая ссылка в таблицу Договоров добавляется уже в существующую запись (UPDATE), то запись в таблице Объектов, из которой следует взять значение поля ???, берётся по выражению ???.??? = ???.???


    Такого варианта не существует если я правильно понял. Мы создаем объект сразу привязанный к договору. Объект не имеет возможности быть созданным без договора.

    В общем на существующий договоро сначала создается object
    INSERT INTO object (title, date1, date2, cid, type_id) VALUES (....)
    Затем к этому object привязываем уже существующий phone_client_item_1 или создаем его новый и сразу уже привязанным.
    INSERT INTO phone_client_item_1 (cid, type, source_id, date1, date2, comment, object_id, alias) VALUES (...)
    После чего мы можем сделать ему UPDATE если хотим скорректировать например название в данном случае
    UPDATE object SET title = ...

    Но основные характеристики данного объекта хранятся в таблицах object_param_value_тип.параметра
    И вносятся подобным образом
    INSERT INTO object_param_value_text (object_id, param_id, `value`) VALUES (...)


    Задача создаваемого триггера, определяемого на таблице ??? при выполнении операции ??? состоит в том, чтобы получить значение поля ??? из таблицы ??? и записать его в поле ??? таблицы ???


    Задача создаваемого триггера, определяемого на таблице object при (ДО) выполнении операции UPDATE состоит в том, чтобы получить значение поля number из таблицы phone_item_number и записать его в поле value таблицы object_param_value_text c соответствующим object_id.
    Написано
  • Почему не получаются значения NEW в триггере BEFORE UPDATE?

    @exotik997 Автор вопроса
    Akina, ПО создает запись в таблице договоров и в поле ссылки на объект использует ID связного объекта. Проблема в том что договор заводится без объектов и они не обязательно должны вообще там быть. Так что я ориентируюсь именно на действие создания объекта на уже существующем созданном договоре.

    То есть на момент UPDATE phone_client_item_1 уже имеется соответствующая запись в phone_item_number_1?

    Если ответить просто, то да. В данной вариации это уже существует.

    Не хотел бы мешать все в кашу

    Вообще касаемо этого имеется 2 вариации. Но думаю это не так важно и выходит за рамки моего текущего вопроса.
    • Возможно привязать уже имеющийся phone_client_item_1 к объекту
    • Но так же возможно phone_client_item_1 создавать на уже имеющийся объект


    Ниже привожу пример UPDATE 'а от ПО. Это именно тот случай когда запись phone_item_number_1 уже существует, ей имеется соответствующая запись в phone_client_item_1 и силами ПО производится внесение
    в phone_client_item_1 идентификатора соответствующего записи в object.

    То есть простым языком мы привязываем уже существующий номер телефона на договоре к пустому созданному объекту. И в этот момент триггер должен получить данные этого номера и самого договора и добваить эти данные в object_param_value_text и другие аналогичные таблицы

    UPDATE phone_client_item_1 SET cid=6968, type=1, source_id=7, date1=DATE'2021-01-13', date2=NULL,  comment='[LOCAL] ???? ?????', object_id=14, alias='' WHERE id=4990


    Делать я это собирался триггером пока что буквально в две строки.

    Это то что пишу в триггере:
    SELECT number INTO num FROM phone_item_number_1 WHERE item_id = id;
    INSERT INTO object_param_value_text (object_id, param_id, value) VALUES (NEW.object_id, 1, num);


    Это то, что ожидаю от триггера с уже подтянутыми данными из договора
    SELECT number INTO num FROM phone_item_number_1 WHERE item_id = 2105;
    INSERT INTO object_param_value_text (object_id, param_id, `value`) VALUES ( 14, 1, '88005553535')
    Написано
  • Почему не получаются значения NEW в триггере BEFORE UPDATE?

    @exotik997 Автор вопроса
    Akina Я благодарю Вас за Ваше терпение и попытку структуризировать информацию выдаваемую мной. Возможно я действительно многое смешал в кашу и сейчас я постараюсь прояснить всю ситуацию. Никаких ЯП и фреймворков нет в рамках моих задач. Чистый SQL, триггеры. Действительно есть ПО(может это именно то что Вы имели в виду под ЯП и фреймворками), которое имеет свою БД со своими таблицами и структурой в которой хранит определенные данные о договорах, клиентах и объектах на этих договорах. Это правда, что ПО не знает об этих триггерах, которые я пытаюсь внедрить и в общем и целом не должно знать о них. Этого не требуется, они не конфликтуют друг с другом. Если абстрактно, то ПО создает в таблице объектов пустой объект со своим id (под пустым я понимаю то, что в других таблицах у него нет параметров с его ID) и в таблице договоров присваивает его id в ячейке в столбце id_объекта для того чтобы как-то связать их. Есть так же еще пара таблиц которые отвечают уже за параметры присваеваемые данному объекту. Таблица для параметров типа текст, типа список и типа флаг. Моя задача заключается в том чтобы в момент создания данного ПУСТОГО объекта, у которого отсутствуют параметры, подхватить данные с договора и насунуть их в эти параметры, которые будут созданы триггерром и обозначены ID соответствующим данному объекту.

    Собственно сама модель:
    CREATE TABLE `phone_client_item_1` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `cid` int(11) NOT NULL DEFAULT 0,
      `object_id` int(11) NOT NULL,
      `type` tinyint(4) NOT NULL DEFAULT 0,
      `source_id` int(11) NOT NULL DEFAULT 0,
      `date1` date DEFAULT NULL,
      `date2` date DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `date1` (`date1`),
      KEY `date2` (`date2`),
      KEY `cid` (`cid`),
      KEY `object_id` (`object_id`),
      KEY `source_id` (`source_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5689 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


    CREATE TABLE `object_param_value_text` (
      `object_id` int(11) NOT NULL DEFAULT 0,
      `param_id` int(11) NOT NULL DEFAULT 0,
      `value` varchar(250) NOT NULL DEFAULT '',
      PRIMARY KEY (`param_id`,`object_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


    CREATE TABLE `object` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `cid` int(11) NOT NULL DEFAULT 0,
      `title` varchar(250) NOT NULL DEFAULT '',
      `type_id` int(11) NOT NULL DEFAULT 0,
      `date1` date DEFAULT NULL,
      `date2` date DEFAULT NULL,
      `pos` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `cid` (`cid`),
      KEY `pos` (`pos`)
    ) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_ci;


    CREATE TABLE `phone_item_number_1` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `item_id` int(11) NOT NULL DEFAULT 0,
      `number` varchar(50) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      KEY `number` (`number`),
      KEY `item_id` (`item_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2117101 DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_ci;


    Моя базовая задача конкретно здесь, план минимум - это BEFORE UPDATE phone_client_item_1
    сделать INSERT INTO (object_id, param_id, value)
    где VALUES будут (NEW.object_id, 1, num), где num - это результат SELECT number INTO num FROM phone_item_number_1 WHERE item_id = id;

    И мне принципиально не понятно две вещи.
    1. Почему на этапе INSERT INTO используя конструкцию NEW.column_name я получаю ничего. NEW.date1 к примеру в сгенерированном триггером SQL запросе остается просто NEW.date1
    2. Почему декларируя переменную и записывая туда NEW.column_name я могу получить ее значение, хотя в пункте №1 не смог. И получаю его в формате NAME_CONST('new_object_id',14).
    Написано
  • Почему не получаются значения NEW в триггере BEFORE UPDATE?

    @exotik997 Автор вопроса
    Akina, вставка в 99.9% случаев произойдет нормально. Смысл в том, что вставка производится уже готовым коммерческим ПО при создании некого объекта, я делаю всего лишь надстройку. Мне надо чтобы когда пользователь нажал "создать объект" в этом ПО - ему сразу вываливался на экране этот созданный объект с уже вставленными данными этим тригером. В противном случае ему надо закрыть объект который будет пустым и открыть его снова чтобы увидеть новые данные.

    Грубо говоря он заводит некую учетку, она заводится по умолчанию с полностью пустыми полями. А я тем самым BEFORE UPDATE уже предварительно вношу данные в определенные таблицы. И как раз после привязки этой учетки к договору ему сразу отображаются данные которые внес триггер.

    И вообще вопрос ведь не во вставке, а в обновлении. Так как триггер BEFORE UPDATE
    Но и UPDATE будет 99.9% успешным, так как это готовое коммерческое ПО

    То есть идея в том что при UPDATE я беру данные из данного UPDATE и вношу их INSERT INTO в другие таблицы чтобы на выходе у пользователя уже подтянулись сгенереные данные. А не закрывать и открывать снова "окошко".
    Написано
  • Почему не получаются значения NEW в триггере BEFORE UPDATE?

    @exotik997 Автор вопроса
    Не совсем понял ответ. Добавил данные по структуре и сами сформированные SQL запросы.

    Дело в том что там как будто даже NULL нету. Если использовать сразу NEW.object_id он его в запросе просто сохраняет текстом. Что то вроде
    INSERT INTO object_param_value_text (object_id, param_id, `value`) VALUES  (NEW.object_id, 1, '123')


    Как мне грубо говоря заставить мой триггер сработать? Получить данные из NEW.object_id которые должны быть interger и использовать их в моем SQL запросе сформированным тригером INSERT INTO object_param_value_text (object_id, param_id, `value`) VALUES (new_object_id, 1, '123');

    Всю ночь провозился пробуя разные варианты.
    Написано
  • Как реализовать редирект пользователей определенной подсети?

    @exotik997 Автор вопроса
    Strabbo, 7301 как сервер авторизации PPPoE клиентов
  • Как реализовать редирект пользователей определенной подсети?

    @exotik997 Автор вопроса
    Спасибо большое за наводку. В нашей биллинговой системе поддержка присутствует только на платной основе, а решения от комьюнити зачастую датируются 2008-2010 годами и так или иначе не подходят для нас.
  • Почему apache начинает использовать огромные количества RAM (SWAP) памяти?

    @exotik997 Автор вопроса
    Пума Тайланд: все эти php-cgi в vestaCP у меня приравниваются к Apache. Судя по всему он это и запускает. Десятки этих процессов которые просто напросто скапливаются и остаются висеть. Накапливаются как снежный ком. Как решить это проблему понятия не имею.
  • Почему apache начинает использовать огромные количества RAM (SWAP) памяти?

    @exotik997 Автор вопроса
    Пума Тайланд: извиняюсь за задержку ответа
    top показывает следущее

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    25205 mysql 20 0 1606824 196452 7516 S 0.0 9.4 1:36.39 mysqld
    23964 root 20 0 516088 46288 38580 S 0.0 2.2 0:00.21 apache2
    25691 admin 20 0 377436 30524 17008 S 0.0 1.5 0:00.42 php-cgi
    24962 admin 20 0 376448 28700 16088 S 0.0 1.4 0:00.32 php-cgi
    24972 admin 20 0 377156 24876 12068 S 0.0 1.2 0:00.08 php-cgi
    24965 admin 20 0 377348 24740 11784 S 0.0 1.2 0:00.13 php-cgi
    24861 admin 20 0 370552 23672 18696 S 0.0 1.1 0:00.03 php-cgi
    24961 admin 20 0 370552 23672 18696 S 0.0 1.1 0:00.04 php-cgi
    25690 admin 20 0 370552 23672 18696 S 0.0 1.1 0:00.03 php-cgi
    24966 admin 20 0 374640 22748 13176 S 0.0 1.1 0:00.09 php-cgi
    25697 admin 20 0 375016 22220 12364 S 0.0 1.1 0:00.11 php-cgi
    25699 admin 20 0 374504 22128 11740 S 0.0 1.1 0:00.06 php-cgi
    25698 admin 20 0 374904 21800 11676 S 0.0 1.0 0:00.11 php-cgi
    25695 admin 20 0 374772 21232 11612 S 0.0 1.0 0:00.10 php-cgi
    25693 admin 20 0 374768 20940 11584 S 0.0 1.0 0:00.08 php-cgi
    24967 admin 20 0 374640 20892 11616 S 0.0 1.0 0:00.07 php-cgi
    24968 admin 20 0 374640 20636 11600 S 0.0 1.0 0:00.07 php-cgi
  • Почему apache начинает использовать огромные количества RAM (SWAP) памяти?

    @exotik997 Автор вопроса
    Пума Тайланд: один апач, мод префорк с таким конфигом
    # Global configuration
    PidFile ${APACHE_PID_FILE}
    Timeout 30
    KeepAlive Off
    MaxKeepAliveRequests 100
    KeepAliveTimeout 10

    StartServers 1
    MinSpareServers 1
    MaxSpareServers 3
    MaxClients 10
    MaxRequestsPerChild 100

    В логах боты которые заходят на сайт парсят его и почему то количество подключений растёт постоянно линейно практически
    апач разрастается через десять часов до 22гб и сайт вешается. Вешается он примерно уже через час
  • Почему apache начинает использовать огромные количества RAM (SWAP) памяти?

    @exotik997 Автор вопроса
    Пума Тайланд: дело в том что писать сам я ничего не писал, я пользуюсь достаточно популярными и рабочими инструментами ubuntu 16.04 vestacp apache (phpfcgid) + nginx и на всём этом добре стоит prestashop
    Этим пользуются и другие люди без подобных проблем. Там что вряд ли дело в говнокоде. При 2ух коннектах апач кушает 19мб
  • Почему apache начинает использовать огромные количества RAM (SWAP) памяти?

    @exotik997 Автор вопроса
    Заходят боты поисковиков, но разве это должно крашить сайт и вызывать дикое юзание РАМ памяти?
  • Почему apache начинает использовать огромные количества RAM (SWAP) памяти?

    @exotik997 Автор вопроса
    Это конечно всё класно, но так получилось что в данной ситуации у меня проблема с апачем которую надо решить именно с ним
  • Почему apache начинает использовать огромные количества RAM (SWAP) памяти?

    @exotik997 Автор вопроса
    Karmashkin: если я вас верно понял то в логах боты гугла и яндекса
    Выглядит это примерно так

    "5.255.253.64 - - [21/Mar/2017:15:20:17 +0300] "GET /index.php?id_category=84&controller=category HTTP/1.0" 301 502 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:20:40 +0300] "GET /84-ip-kamera-s-obratnoj-svyazyu HTTP/1.0" 200 17468 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:21:03 +0300] "GET /index.php?id_category=3&controller=category&p=5 HTTP/1.0" 301 483 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    185.159.130.28 - - [21/Mar/2017:15:21:27 +0300] "GET /204-home_default/dh-hac-hdw2221rp-z-dp-kupolnaya-hdcvi-videokamera-1080p.jpg HTTP/1.1" 200 26720 "https://sistemy-bezopasnosti161.ru/3-kamery?p=5" "Serf/1.3.8 (mod_pagespeed/1.12.34.1-0)"
    5.255.253.64 - - [21/Mar/2017:15:21:26 +0300] "GET /3-kamery?p=5 HTTP/1.0" 200 18975 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:21:49 +0300] "GET /index.php?id_category=96&controller=category HTTP/1.0" 301 4089 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:22:12 +0300] "GET /96-pult-upravleniya-povorotnymi-kamerami HTTP/1.0" 200 13939 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:22:35 +0300] "GET /index.php?id_product=436&controller=product HTTP/1.0" 301 527 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:22:58 +0300] "GET /katalog/436-blok-besperebojnogo-pitaniya-bbp-30-max.html HTTP/1.0" 200 17151 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:23:21 +0300] "GET /index.php?id_product=294&controller=product HTTP/1.0" 301 511 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:23:44 +0300] "GET /katalog/294-svn-cn20h300a-28mm-31mp.html HTTP/1.0" 200 17441 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:24:07 +0300] "GET /index.php?id_product=91&controller=product HTTP/1.0" 301 525 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:24:31 +0300] "GET /img/p/4/6/0/460-home_default.jpg HTTP/1.1" 200 5456 "-" "Mozilla/5.0 (compatible; YandexImages/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:24:54 +0300] "GET /katalog/91-ip-videoregistrator-24-kan-evd-8224-11.html HTTP/1.0" 200 17941 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:25:17 +0300] "GET /index.php?id_product=445&controller=product HTTP/1.0" 301 511 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:25:40 +0300] "GET /katalog/445-blok-pitaniya-ts-5a-opn.html HTTP/1.0" 200 16719 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)"
    5.255.253.64 - - [21/Mar/2017:15:26:03 +0300] "GET /index.php?id_product=433&controller=product HTTP/1.0" 301 527 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +yandex.com/bots)""
  • Сайт со списком приложений и фреймворков использованных в нём?

    @exotik997 Автор вопроса
    Нет, но тоже очень удобный сервис. Спасибо
  • Поступление в ВУЗ, какое направление выбрать?

    @exotik997 Автор вопроса
    Честно говоря очень напрягает важность выбора направления. Важно ли это вообще?
    Потому что есть такое ощущение что щас выберу не то направление и потом буду работать за 20-30к рублей до старости лет. Никуда брать не будут, знаю бред, но страх есть.
  • Обучение в ВУЗе по IT специальности??

    @exotik997 Автор вопроса
    Благодарю за совет и мотивацию, будем пробоваться))
  • Обучение в ВУЗе по IT специальности??

    @exotik997 Автор вопроса
    brainick: я знаю что это абсолютно разные вещи и что это на сегодняшний день слабо ценится, но я всего лишь обозначил свои знания. 65-80 баллов информатику думаю взять смог бы
  • Обучение в ВУЗе по IT специальности??

    @exotik997 Автор вопроса
    Moskus: факт не факт, а меня интересует где я буду ближе всего к знаниям которые мне пригодятся на практике. Знаю что все обсирают нынешнее образование и в особенности в сфере IT, но все же хотел выслушать какие то советы по поступлению, обучению и выбору направления..
    И да, с двумя сотнями баллов я могу поступить в очень хорошие институты в моем городе
    Например ЮФУ или РГУПС
  • Обучение в ВУЗе по IT специальности??

    @exotik997 Автор вопроса
    Moskus: мошенничество в масштабах государства? Опять?
    Я живу не в Москве, в моем городе имея 210 баллов можно поступить практически куда угодно на бюджет