Переход на PHP 7
В октябре 2017 меня постигло очередное горе. После обновления wordpress и плагинов, нагрузка на сервер опять значительно возросла, это при том, что в сентябре посещаемость по сравнению с июлем меньше. В логах ошибок на сервере чисто. Вообще эта картина довольно типична, когда после обновления плагинов возрастает нагрузка на сервер.
Нагрузка за июль, я превышаю. Моя зона синяя.
Я перевела сайт на php7. Это было не просто. Сначала при переключении вместо своего сайта я видела белую страницу с надписью:«Ошибка соединения с базой данных». Хостер мне не смог помочь советами, пришлось разбираться самостоятельно. Оказалось я использовала устаревшее соединение с базой данных. Для его обновления нужно просто перегенерировать пароль соединения с базой данных и всё, но на поиски этого решения я потратила 2 дня.
После переключения нагрузка на сайт начала зашкаливать за разумные пределы, вопреки многочисленным предсказаниям о том, что она просто обязана упасть. Еще несколько дней раздумий и экспериментов и я решила и эту проблему. Оказалось в function.php моей темы я добавила (по советам от опытных вебмастеров из интернета) функцию, которая содержала в себе лишний цикл, давно уже. При работе на php5.3 перегрузки не возникало, а после переключения на php7 просто начало зашкаливать. Когда я устранила эту проблему, я увидела свою нагрузку наконец в синей зоне.
Нагрузка за октябрь. Пики были вызваны ошибками в function.php, они проявлялись только в о время работы в админке, поэтому мне было трудно понять в чем дело
Последние поступления:
Размещена 10 августа 2020 года
Я по ТВ видел, что через 10 лет мы будем жить лучше, чем в Германии…
Я не понял, что это они с Германией сделать хотят?!
Размещена 14 марта 2018 года
Пpоект Genesis (из коpпоpативной пеpеписки)
Шпаргалка по работе с Vim
Размещена 05 декабря 2017 года
Vim довольно мощный редактор, но работа с ним не всегда наглядна.
Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.
Ошибка: Error: Cannot find a valid baseurl for repo
Размещена 13 сентабря 2017 года
Если возникает ошибка на centos 5 вида
YumRepo Error: All mirror URLs are not using ftp, http or file.
Eg. Invalid release/
Мой опыт использования CDN (Content Delivery Network)
Я дождалась очередного злостного письма от своего хостера Sweb. В связи с наступлением активного туристического сезона посещаемость моего сайта скачкообразно возросла и нагрузка на сервер, создаваемая процессами на моем сайте достигла критической величины 120 минут в сутки, напомню что согласно договору моему сайту положено было потреблять всего 60 минут процессорного времени в сутки.
Sweb предложил мне перейти на другой тариф стоимостью всего 800 руб. в месяц!!! Эта не гуманная сумма меня никак не устраивала, тогда я платила всего 120 руб. в месяц, повысить цену почти в 6 раз, это грабеж. В результате жаба меня задушила и я решила попробовать CDN от CloudFlare, в конце концов другого выхода у меня не было.
У CloudFlare есть бесплатный тариф, именно на него я и подключилась. Больше всего беспокойства вызывало требование переписать на CloudFlare мои DNS записи, но я сделала это, и в результате вы видите на графике нагрузка на сервер существенно снизилась до порога который Sweb склонен прощать. Момент подключения CDN я отметила зеленой меткой на картинке.
Я конечно ожидала большего, мне мечталось увидеть цифру 30 минут в сутки, но этого не произошло. CDN это система серверов по всему миру на которые копируется ваш сайт и при запросе, например идущем из США, отвечает сервер расположенный в США, а не в Санкт-Петербурге, что должно сократить время загрузки сайта и попутно этот метод сокращает нагрузку на мой сервер.
Кроме системы доставки контента CloudFlare предлагает еще защиту от DOS-атак, аналитику и минимизацию html, css, и js. Вот тут я включила минимизацию, раз CloudFlare берет это все на себя.
Бесплатный аккаунт CloudFlare имеет ряд ограничений, что вполне естественно. За один запрос посетитель может загрузить с CloudFlare не более 100Мб и сервера обновляются в течении 24 часов. Т.е. если продать ссылку покупатель увидит ее не сразу, а в течении 24 часов.
Из недостатков CloudFlare я заметила следующие:
- Функция Always Online совершенно не гарантирует показ вашего сайта, если ваш собственный сервер перестанет работать. Многие русские блогеры обещали такую фишку, но на самом деле это не так. На официальном сайте CloudFlare написано, что он не сохраняет абсолютно все страницы вашего сайта, он сохраняет первые 10 html- страниц сайта и лишь некоторые ссылки с них, сами понимаете, что это ничтожно мало для блога состоящего из 400 страниц. Поэтому, когда мой сервер падает, я вижу вместо своего сайта сообщение об ошибке от CloudFlare.
- Мой сайт, подключенный к CloudFlare блокируется для интернет соединений, использующих TOR. Я это заметила сидючи в facebook, там я советовала свой сайт людям и некоторые мне отписывались, что страница не открывается. Что характерно, когда они заходили на мой сайт через мобильный интернет у них все открывалось, у меня тоже все открывалось, сайт в этот момент работал. Дело было именно в интернет соединении.
- Невозможно одновременно использовать SSL сертификат от хостера и пользоваться CloudFlare на бесплатном тарифе. Бесплатный сертификат от CloudFlare не поддерживается на устаревших операционных системах и браузерах, типа операционной системы Windows Vista и т.д. Ставить свой собственный SSL сертификат можно только на тарифе 200$ в месяц.
Сообщение об ошибке, которое я вижу если мой сервер слёгАналитика на октябрь 2017
Кеширование часто используемых объектов
Обработка запросов в веб-приложениях часто связана с извлечением данных, обычно из удаленных источников, таких как базы данных или веб-службы. Выборка данных — довольно дорогостоящая операция, нередко связанная с необходимостью ожидания ответа. Вместо извлечения данных для каждой отдельной операции, их можно извлечь сразу все и сохранить в памяти, применив какой-либо механизм кеширования. После этого, для обработки вновь поступающих запросов, данные можно извлекать из кеша, не обращаясь к удаленному источнику. Алгоритм кеширования часто описывается следующим образом:
-
Если данные уже присутствуют в кеше, используются эти данные.
-
Иначе извлечь данные, сохранить в кеше и использовать их.
Так как к одному и тому же объекту в кеше может обратиться сразу несколько запросов из разных потоков выполнения, необходимо предусмотреть непротиворечивое изменение объекта в кеше — либо интерпретировать его как неизменяемый (в этом случае, чтобы изменить объект в кеше, необходимо создать его копию, выполнить изменения в копии и сохранить измененную копию в кеше), либо использовать механизмы блокировки, чтобы исключить конфликты между разными потоками выполнения.
Многие разработчики используют в роли кеша коллекцию Application, потому что она обеспечивает кеширование в памяти, доступна всем пользователям из всех сеансов. Работать с коллекцией Application очень просто:
При использовании коллекции Application, сохраняемые объекты постепенно накапливаются в памяти, что может привести к ее исчерпанию и вызвать необходимость использования файла подкачки или даже вызвать ошибку нехватки памяти. Поэтому ASP.NET предоставляет специальный механизм кеширования, поддерживающий средства управления объектами в кеше и удаляющий неиспользуемые объекты из кеша при нехватке памяти.
Кеширование в ASP.NET доступно через класс Cache, реализующий обширный механизм кеширования, который помимо возможности хранить объекты также позволяет:
-
Определять предельное время хранения объектов в кеше, указывая либо значение типа TimeSpan (продолжительность), либо значение типа DateTime (конкретные дата и время). По истечении времени хранения объекты будут удаляться из кеша автоматически.
-
Определять приоритеты кешируемых объектов. При нехватке памяти, когда требуется освободить место в кеше, наличие приоритетов помогает механизму кеша решить, какие из объектов «менее важны».
-
Определять правила проверки допустимости хранения объектов в кеш, добавляя зависимости, такие как зависимости от SQL. Например, если кешируемый объект был получен в результате SQL-запроса, можно установить зависимость объекта от SQL, чтобы изменения в базе данных, влияющие на результат запроса, делали объект в кеше недействительным.
-
Присоединять к объектам в кеше функции обратного вызова, которые должны вызываться при удалении объектов из кеша. Использование функций обратного вызова позволит своевременно обновлять данные в кеше, как только истекает время их хранения или они становятся недействительными.
Добавление элементов в кеш выполняется так же, как добавление элементов в словарь:
При добавлении в кеш таким способом, элемент получит приоритет по умолчанию Normal и не будет иметь предельного времени хранения или зависимостей. Например, чтобы добавить элемент в кеш, который должен хранить некоторый интервал времени, используйте метод Insert:
Парадигма доступа к кешу с использованием класса Cache реализуется следующим образом:
Обратите внимание, что в первой строке в этом примере извлечение объекта из кеша выполняется без предварительной проверки его наличия там. Это обусловлено тем, что объекты могут удаляться из кеша в любые моменты времени другими запросами или самим механизмом кеширования, то есть объект может быть удален между проверкой его существования и операцией извлечения
Что такое производственная среда?
Серверная среда для веб-приложения в общем смысле состоит из аппаратного обеспечения, программного обеспечения, данных, операционных планов и персонала, который поддерживает работу приложения. Производственная среда – это серверная среда, которая была разработана и реализована с максимальным учетом таких факторов:
- Доступность: возможность использования приложения целевыми пользователями в течение объявленных часов. Доступность может быть нарушена при любом сбое, который влияет на работу критического компонента (например, сервер базы данных выходит из строя или системный администратор случайно отключает сервер приложений). Одним из способов повышения доступности является уменьшение количества единых точек отказа в среде.
- Восстанавливаемость: возможность восстановления среды приложения в случае сбоя системы или потери данных. Если критический компонент выходит из строя и не восстанавливается, приложение не будет доступно.
- Производительность: поддержка работы приложения при средней или максимальной нагрузке.
- Балансировка нагрузки Nginx
- Использование плавающих IP-адресов
- Что такое балансировка нагрузки?
Обратите внимание, что здесь не упоминаются такие факторы:
- надежность аппаратного обеспечения (вероятность того, что данный аппаратный компонент будет функционировать должным образом в течение определенного количества времени перед сбоем);
- и безопасность.
Это связано с тем, что мы предполагаем, что:
- используемые вами облачные серверы, как правило, надежны, но могут прекратить работу (поскольку они работают на физических серверах);
- вы самостоятельно следуете лучшим рекомендациям по безопасности (потому они выходят за рамки данной статьи).
Однако вы должны знать, что надежность и безопасность являются факторами, которые могут напрямую повлиять на доступность и поспособствовать восстановлению работы приложения.
Вместо демонстрации пошаговой процедуры создания производственной среды (что невозможно из-за индивидуальных потребностей каждого приложения) мы предлагаем рассмотреть дополнительные компоненты, которые могут преобразовать текущую установку в производственную среду.
Как избежать курсоров в SQL Server
Ниже перечислены варианты написания кода T-SQL, позволяющие избежать использование курсоров:
- Логика на основе множеств
- INSERT или SELECT INTO, или INSERT…SELECT для добавления записей в таблицу за одну транзакцию.
- UPDATE для модификации одной или многих строк в одной транзакции.
DELETE или TRUNCATE для удаления записей из таблицы.
Ветвящаяся логика MERGE для вставки, удаления или обновления данных на основе критериев.
Рассмотрите возможность использования служб интеграции SQL Server (SSIS) для циклического перебора данных, в первую очередь, для извлечения, преобразования и загрузки данных из одной базы данных в другую.
Команда WHILE для циклического обхода записей в последовательной манере.
Команда COALESCE для обработки не-NULL значений.
Системная хранимая процедура sp_MSforeachdb в SQL Server для перебора в цикле всех баз данных в экземпляре.
Системная хранимая процедура sp_MSforeachtable в SQL Server для перебора в цикле всех таблиц в базе данных.
Выражение CASE, которое может включать некоторую логику ветвления в обработку данных с помощью оператора SELECT.
Повторение пакета с помощью команды GO.
За
- Разделение логики с другими приложениями. Хранимые процедуры инкапсулируют функциональность; это обеспечивает связность доступа к данным и управления ими между различными приложениями.
- Изоляция пользователей от таблиц базы данных. Это позволяет давать доступ к хранимым процедурам, но не к самим данным таблиц.
- Обеспечивает механизм защиты. В соответствии с предыдущим пунктом, если вы можете получить доступ к данным только через хранимые процедуры, никто другой не сможет стереть ваши данные через команду SQL DELETE.
- Улучшение выполнения как следствие сокращения сетевого трафика. С помощью хранимых процедур множество запросов могут быть объединены.
Триггеры
Триггеры — это особые хранимые процедуры, выполняемые в ответ на происходящие в базе данных события. Они относятся к числу наиболее важных элементов промышленных приложений базы данных. Основным назначением триггеров является поддержка ограничений целостности, которые не реализуются при помощи внешних ключей и ограничений, накладываемых на значение столбца (NOT NULL, CHEK и т.д.).
Триггеры уровня инструкций языка манипулирования данными (триггеры DML) запускаются после вставки, обновления или удаления строки конкретной таблицы. Это наиболее распространенный тип триггеров, особенно часто применяемый разработчиками.
Триггер BEFORE. Вызывается до внесения каких-либо изменений, в том числе до вставки записи (BEFORE INSERT).
Триггер AFTER. Выполняется после того, как производятся все изменения, в частности после операции вставки записи (AFTER INSERT).
Существуют, также, следующие виды триггеров:
Триггер уровня инструкции. Выполняется для отдельной SQL-инструкции, которая может обрабатывать одну или более записей базы данных.
Триггер уровня записи. Вызывается для отдельной записи, обрабатываемой SQL-инструкцией. Если, предположим, таблица books содержит 1000 строк, то следующая инструкция UPDATE модифицирует все эти строки: UPDATE books SET title = UPPER (title); И если для данной таблицы определен триггер уровня записи, он будет запущен 1000 раз.
Псевдозапись NEW. Структура данных с именем NEW, которая так же выглядит и обладает такими же свойствами, как и запись таблицы. Эта псевдозапись доступна только внутри триггеров обновления и вставки; она содержит значения модифицированной записи после внесения изменений.
Псевдозапись OLD. Структура данных с именем OLD, которая так же выглядит и обладает такими же свойствами, как и запись таблицы. Эта псевдозапись Доступна только внутри триггеров обновления и удаления; она содержит значения модифицируемой записи до внесения изменений.
Синтаксис оператора создания триггера:
CREATE TRIGGER <имя_триггера> {BEFORE | AFTER} <событие_БД>
ON <имя_таблицы> FOR EACH ROW
BEGIN
<операторы>
END
<событие_БД> — определение типа DML-инструкции, с которой связывается триггер: INSERT, UPDATE или DELETE. У каждой таблицы для каждого события может существовать только один триггер.
Триггер, осуществляющий проверку веса детали при добавлении ее в таблицу Parts (вес не должен превышать заданного значения)
CREATE TRIGGER Check_Weight BEFORE INSERT ON Parts FOR EACH ROW
BEGIN
DECLARE Wrong_weight CONDITION FOR SQLSTATE ‘45000’;
IF NEW.Weight > 1000 THEN
SIGNAL Wrong_weight SET MESSAGE_TEXT = ‘Вес детали превышает 1000!’;
END IF;
END
Триггер, осуществляющий проверку на совпадение наименований деталей:
CREATE TRIGGER Check_Part_Name BEFORE INSERT ON Parts FOR EACH ROW
BEGIN
DECLARE Duplicate_part_name CONDITION FOR SQLSTATE ‘45000’;
DECLARE N INTEGER;
SELECT COUNT(*) INTO N FROM Parts WHERE Part_name=NEW. Part_name;
IF N > 0 THEN
SIGNAL Duplicate_part_name SET MESSAGE_TEXT = ‘Такая деталь уже есть в базе!’;
END IF;
END
Триггер, который удаляет все детали, наименование которых совпадает с удаляемой деталью (не будет работать):
CREATE TRIGGER Delete_the_same_parts AFTER DELETE ON Parts FOR EACH ROW
BEGIN
DELETE FROM Parts WHERE Part_name=OLD.Part_name;
END
Во-вторых, создайте хранимые процедуры и функции.
Процесс создания хранимых процедур и функций очень похож.
2.1 Создание хранимой процедуры
proc_parameter определяет список параметров хранимой процедуры, формат списка следующий:
Где in представляет входной параметр, out представляет выходной параметр, inout представляет как вход, так и выход; param_name представляет имя параметра; type представляет тип параметра
Тип может быть любым типом в базе данных MYSQL
Доступны следующие значения:
LANGUAGE SQL : Объясните, что часть подпрограммы_body состоит из операторов SQL, язык, поддерживаемый текущей системой, — это SQL, а SQL — единственное значение функции LANGUAGE.
DETERMINISTIC : Укажите, правильный ли результат выполнения хранимой процедуры. ДЕТЕРМИНИСТИЧЕСКИЙ означает, что результат определен. Каждый раз, когда выполняется хранимая процедура, один и тот же ввод будет
ДЕТЕРМИНИСТИЧЕСКИЙ означает, что результат неопределен, и один и тот же вход может иметь разные выходные данные. Если значение не указано, по умолчанию используется ДЕТЕРМИНИСТИЧЕСКИЙ
CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA: Укажите ограничение на использование операторов SQL в подпрограммах.
CONTAINS SQL указывает, что подпрограмма содержит операторы SQL, но не содержит операторов, считывающих и записывающих данные;
NO SQL указывает, что подпрограмма не содержит операторов SQL;
READS SQL DATA: указывает, что подпрограмма содержит операторы, которые читают данные;
MODIFIES SQL DATA указывает, что подпрограмма содержит операторы для записи данных.
По умолчанию система укажет CONTAINS SQL
SQL SECURITY : Укажите, кто имеет разрешение на выполнение. DEFINER означает, что только определитель может выполнять
INVOKER означает, что вызывающий с разрешением может выполнять. По умолчанию система обозначена как DEFINER
COMMENT’string ‘: информация комментария, которая может использоваться для описания хранимых процедур или функций.
подпрограмма_body — это содержимое кода SQL, вы можете использовать BEGIN . END, чтобы указать начало и конец кода SQL.
Следующий оператор создает хранимую процедуру для запроса статистики таблицы заказов.
Логика здесь 1. Сначала определите, существует ли хранимая процедура countOrder (), и отбросьте ее, если она есть. 2. Создайте хранимую процедуру countOrder (). 3. Выполните хранимую процедуру countOrder ().
2.2 Создание функции
Создайте функцию с помощью оператора CREATE FUNCTION:
Список параметров может быть пустым, если он не пустой, форма объявления такая же, как и у хранимой процедуры. Характеристики используется для указания характеристик функции, а значение такое же, как указано выше, поэтому я не буду повторять его здесь. func_parameter — это список параметров сохраненной функции, список параметров выглядит следующим образом
Тип RETURNS представляет тип возвращаемого значения функции; тело_программы — это тело функции, а тело функции должно содержать оператор значения RETURN.
Курсоры (MySQL Cursors)
Курсоры позволяют пройтись по всем полученным результатам запроса. На теории объяснить сложно, покажу на практике. Добавим еще одну таблицу к нашей базе данных — hits:
CREATE TABLE `tags` ( `id` INT NOT NULL AUTO_INCREMENT , `tag` VARCHAR(255) NOT NULL , PRIMARY KEY ( `id` ) ) ENGINE = MYISAM
Сюда мы будем записывать все тэги из всех тем. Хранимая процедура будет выглядеть примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
CREATE PROCEDURE `procedure3`() BEGIN DECLARE done INT DEFAULT 0; DECLARE sTag VARCHAR(255); DECLARE iCount INT DEFAULT 0; DECLARE rCursor CURSOR FOR SELECT `tag` FROM `threads` WHERE 1; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; OPEN rCursor; FETCH rCursor INTO sTag; WHILE done = 0 DO SELECT COUNT(*) INTO iCount FROM `tags` WHERE `tag` = sTag; IF iCount = 0 THEN INSERT INTO `tags` (`tag`) VALUES (sTag); END IF; FETCH rCursor INTO sTag; END WHILE; CLOSE rCursor; END |
Подробно. Процедура пройдет через каждую тему, каждый тег пробьет по таблице tags, и если данный тег отсутствует, то она его добавит.
Курсор для запроса SELECT, который выберет теги из всех тем (WHERE 1). После курсора объявляем что-то вроде исключения — что делать, когда результаты кончатся (SQLSTATE ‘02000′ означает это окончание). В этом случае мы в переменную done запишем 1, чтобы в последствии выйти из цикла.
Открываем курсор, и получаем первую запись. Дальше в цикле — Выбираем количество совпадений из таблицы тегов для текущего тега и помещаем результат в переменную iCount. Если результатов нет, то запросом INSERT вставляем новый тег.
В конце концов закрываем курсор и выходим из процедуры. Ну вот и всё.
HeartBeat API
Нагрузка на сервер существенно возрастает в момент, когда я пишу статью, поскольку в этом случает работает мой сервер. Я отключила создание ревизий совсем и даже отключила возможности HeartBeat API, выполняющее автосохранение записи при написании статьи и прочие функции, необходимые, если редакторов на сайте несколько человек. После того, как мне пришлось переписать статью в 3000 слов по памяти, после отключения электричества я вернула эту опцию обратно. Очень она полезная.
Пыталась писать статьи в гугл-документах, но что-то не зашло. Мой новый плагин кеширования LiteSpeed Cache позволяет регулировать частоту автосохранения данных в окне редактирования, можно поставить интервал побольше и нагрузка снизится. Существуют отдельные плагины, позволяющие регулировать эту функцию.
Шаг 4: Переменные
Сейчас я научу вас создавать переменные и сохранять их внутри процедур. Вы должны объявлять их явно в начале блока BEGIN/END, вместе с их типами данных. Как только вы объявили переменную, вы можете использовать ее там же, где переменные сессии, литералы или имена колонок.
Синтаксис объявления переменной выглядит так:
DECLARE varname DATA-TYPE DEFAULT defaultvalue;
Давайте объявим несколько переменных:
DECLARE a, b INT DEFAULT 5;
DECLARE str VARCHAR(50);
DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;
DECLARE v1, v2, v3 TINYINT;
Работа с переменными
Как только вы объявили переменную, вы можете задать ей значение с помощью команд SET или SELECT:
DELIMITER //
CREATE PROCEDURE `var_proc` (IN paramstr VARCHAR(20)) BEGIN DECLARE a, b INT DEFAULT 5; DECLARE str VARCHAR(50); DECLARE today TIMESTAMP DEFAULT CURRENT_DATE; DECLARE v1, v2, v3 TINYINT;
INSERT INTO table1 VALUES (a); SET str = ‘I am a string’; SELECT CONCAT(str,paramstr), today FROM table2 WHERE b >=5; END //
Создание хранимой процедуры
Создадим процедуру с именем GetAllProducts() для получения списка всех продуктов из таблицы.
Для этого нужно загрузить mysql-клиент и выполнить следующие команды:
Команда DELIMITER //
не входит в хранимые процедуры. DELIMITER – специальная команда, изменяющая стандартный разделитель запросов (по умолчанию «;») на указанный после нее. Этой командой изменим его на 2 слеша (//).
Если не изменить разделитель, то mysql ошибочно интерпретирует процедуру и выдаст ошибку. После END используется разделитель // и с помощью команды DELIMITER возвращается значение разделителя «;».
Зарезервированные слова CREATE PROCEDURE указывают mysql, что нужно СОЗДАТЬ ПРОЦЕДУРУ. После этих слов нужно указать название хранимой процедуры (в примере GetAllProducts). Пустые скобки «()» после названия процедуры означает, что процедура не принимает никаких переменных.
Команды BEGIN и END соответственно открывают и закрывают блок кода SQL.
В консоли mysql хранимые процедуры писать не очень удобно. В таком случае можно воспользоваться GUI tools, с помощью которых можно создавать хранимые процедуры в интуитивно понятном интерфейсе.
В MySQL Workbench
процедура создается нажатием правой кнопкой мыши на Routines и выбором в выпадающем меню пункта Create Procedure…
Можно просмотреть полный код, который отправится в MySQL, перед тем, как он запишется в базу данных. Если ошибок нет, нажимаем Apply
.
После компиляции MySQL записывает процедуру в каталог. После завершения записи нажимаем кнопку Finish
.
Можно увидеть созданную хранимую процедуру в списке Routines.
Шаг 2: Как работать с хранимыми процедурами
Создание хранимой процедуры
DELIMITER //
CREATE PROCEDURE `p2` ()
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT «A procedure»
BEGIN
SELECT «Hello World !»;
END//
Первая часть кода создает хранимую процедуру. Следующая — содержит необязательные параметры. Затем идет название и, наконец, тело самой процедуры.
Названия хранимых процедур чувствительны к регистру. Вам также нельзя создавать несколько процедур с одинаковым названием. Внутри хранимой процедуры не может быть выражений, изменяющих саму базу данных.
4 характеристики хранимой процедуры:
- Language: в целях обеспечения переносимости, по умолчанию указан SQL.
- Deterministic: если процедура все время возвращает один и тот же результат, и принимает одни и те же входящие параметры. Это для репликации и процесса регистрации. Значение по умолчанию — NOT DETERMINISTIC.
- SQL Security: во время вызова идет проверка прав пользователя. INVOKER — это пользователь, вызывающий хранимую процедуру. DEFINER — это “создатель” процедуры. Значение по умолчанию — DEFINER.
- Comment: в целях документирования, значение по умолчанию — «»
Вызов хранимой процедуры
Чтобы вызвать хранимую процедуру, необходимо напечатать ключевое слово CALL, а затем название процедуры, а в скобках указать параметры (переменные или значения). Скобки обязательны.
CALL stored_procedure_name (param1, param2, ….)
CALL procedure1(10 , «string parameter» , @parameter_var);
Изменение хранимой процедуры
В MySQL есть выражение ALTER PROCEDURE для изменения процедур, но оно подходит для изменения лишь некоторых характеристик. Если вам нужно изменить параметры или тело процедуры, вам следует удалить и создать ее заново.
Удаление хранимой процедуры
DROP PROCEDURE IF EXISTS p2;
Это простая команда. Выражение IF EXISTS отлавливает ошибку в случае, если такой процедуры не существует.