SlideShare a Scribd company logo
СУБД
Лекция 4
Павел Щербинин
Хранимые процедуры
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
func_parameter:
param_name type
Хранимые процедуры
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| {
CONTAINS SQL
| NO SQL
| READS SQL DATA
| MODIFIES SQL DATA
}
| SQL SECURITY { DEFINER | INVOKER }
routine_body:
Valid SQL routine statement
Хранимые процедуры ЗА
 Разделение логики с другими приложениями. Хранимые
процедуры инкапсулируют функциональность; это
обеспечивает связность доступа к данным и управления ими
между различными приложениями.
 Изоляция пользователей от таблиц базы данных. Это
позволяет давать доступ к хранимым процедурам, но не к
самим данным таблиц.
 Обеспечивает механизм защиты.
 Улучшение выполнения как следствие сокращения сетевого
трафика. С помощью хранимых процедур множество запросов
могут быть объединены.
Хранимые процедуры ПРОТИВ
• Повышение нагрузки на сервер баз данных в связи с тем, что
большая часть работы выполняется на серверной части, а
меньшая - на клиентской.
• Дублирование логики своего приложения в двух местах:
серверный код и код для хранимых процедур, тем самым
усложняя процесс манипулирования данными.
• Миграция с одной СУБД на другую (DB2, SQL Server и др.)
может привести к проблемам.
Хранимые процедуры ПРИМЕР
DELIMITER //
DROPPROCEDUREIF EXISTS p1//
CREATE PROCEDURE `p1` ()
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A procedure'
BEGIN
SELECT 'Hello World !';
END//
CALL p1();
Хранимые процедуры ПРИМЕР
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 //
Хранимые процедуры
УСЛОВИЯ
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
Хранимые процедуры
LOOP
[begin_label:] LOOP
statement_list
END LOOP [end_label]
CREATE PROCEDURE doiterate(p1 INT)
BEGIN
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN
ITERATE label1;
END IF;
LEAVE label1;
END LOOP label1;
SET @x = p1;
END;
Хранимые процедуры
REPEAT, WHILE
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
CREATE PROCEDURE dowhile()
BEGIN
DECLARE v1 INT DEFAULT 5;
WHILE v1 > 0 DO
...
SET v1 = v1 - 1;
END WHILE;
END;
Хранимые процедуры
HANDLER
DECLARE handler_action HANDLER
FOR condition_value [, condition_value] ...
statement
handler_action:
CONTINUE
| EXIT
| UNDO
condition_value:
mysql_error_code
| SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
Хранимые процедуры
КУРСОРЫ
DECLARE cursor-name CURSOR FOR SELECT ...;
OPEN cursor-name;
FETCH cursor-name INTO variable [, variable];
CLOSE cursor-name;
Declare vBankId integer;
Declare vBankName VARCHAR(50);
Declare vAddress VARCHAR(50);
Declare done integer default 0;
Declare BankCursor Cursor for
Select`bank`.`BankId`,`bank`.`BankName`,`bank`.`Address` FROM
`bank`;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
Open BankCursor;
WHILE done = 0 DO
FETCH BankCursor INTO vBankId,vBankName,vAddress;
END WHILE;
Close BankCursor;
Хранимые процедуры
EXECUTE
EXECUTE stmt_name [USING @var_name [, @var_name] ...]
DELIMITER $$
DROP PROCEDURE IF EXISTS `create_archive`$$
CREATE PROCEDURE `create_archive`(IN current_table VARCHAR(50))
BEGIN
DECLARE template,archive_template VARCHAR(50);
SET archive_template=replace(curdate(),"-","");
SET template=CONCAT(current_table,"_",archive_template);
SET @archive_query:=CONCAT("CREATE TABLE ",template,"
ENGINE=ARCHIVE AS
(SELECT * FROM ",current_table," )");
PREPARE archive_query FROM @archive_query;
EXECUTE archive_query;
DEALLOCATE PREPARE archive_query;
END$$
Триггеры
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body
trigger_time = BEFORE | AFTER
trigger_event = INSERT | UPDATE | DELETE
Триггеры (Пример)
CREATE TRIGGER
add_count_comment
AFTER INSERT ON comments
FOR EACH ROW BEGIN
UPDATE
user
SET
user.countcomment=user.countcomment+1
WHERE
user.id = NEW.user_id;
Триггеры (Пример)
CASE NEW.owner_name
WHEN 'Blog' THEN
UPDATE blog
SET comment = comment+1
WHERE id = NEW.owner_id ;
WHEN 'Article' THEN
UPDATE article
SET comment = comment+1
WHERE id = NEW.owner_id ;
WHEN 'PopulatePlace' THEN
UPDATE populate_place
SET comment = comment+1
WHERE id = NEW.owner_id ;
END CASE;
Триггеры (Пример)
CASE NEW.owner_name
WHEN 'Blog' THEN
SET usertitle = (
select title from blog where id=NEW.owner_id
);
WHEN 'Article' THEN
SET usertitle = (
select title from article where id=NEW.owner_id
);
WHEN 'PopulatePlace' THEN
SET usertitle = '';
END CASE;
INSERT INTO user_has_events VALUES (NEW.user_id, NEW.id,
"Comments", NOW() , usertitle );
END
Транзакции
• START TRANSACTION
• COMMIT
• ROLLBACK
Транзакции
START TRANSACTION;
SELECT balance FROM checking WHERE customer_id
= 10233276;
UPDATE checking SET balance = balance - 200.00
WHERE customer_id = 10233276;
UPDATE savings SET balance = balance + 200.00
WHERE customer_id = 10233276;
COMMIT;
ACID
• Atomicity (Атомарность)
Транзакция должна функционировать как единая неделимая еденица работы
таким образом, чтобы вся транзакция была либо выполнена, либо отменена.
• Consistency (Непротиворечивость)
База данных должна всегда переходить из одного непротиворечивого
состояния в последующее.
• Isolation (Изолированность)
Результаты транзакции обычно невидимы другим транзакциям, пока она не
закончена.
• Durability (Долговечность)
Будучи зафиксированы, внесенные в ходе транзакции изменения становятся
постоянными. Это означает, что изменения должны быть записаны так, чтобы
данные не могли быть потеряны в случае сбоя системы.
Уровни изоляции
Уровень изоляции
Возможность
чернового
чтения
Возможность
невоспроизво
димого чтения
Возможность
фантомного
чтения
Блокировка
чтения
READ UNCOMMITTED Да Да Да Нет
READ COMMITTED Нет Да Да Нет
REPEATABLE READ Нет Нет Да Нет
SERIALIZABLE Нет Нет Нет Да
Уровни изоляции
Уровень изоляции
Возможность
чернового
чтения
Возможность
невоспроизво
димого чтения
Возможность
фантомного
чтения
Блокировка
чтения
READ UNCOMMITTED Да Да Да Нет
READ COMMITTED Нет Да Да Нет
REPEATABLE READ Нет Нет Да Нет
SERIALIZABLE Нет Нет Нет Да
Взаимоблокировки
Транзакция #1
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date =
2002-05-01;
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date =
2002-05-02;
COMMIT;
Транзакция #2
START TRANSACTION;
UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date =
2002-05-02;
UPDATE StockPrice SET high = 47.20 WHERE stock_id = 4 and date =
2002-05-01;
COMMIT;
Ручные блокировки
SELECT ... FOR UPDATE;
SELECT ... LOCK IN SHARE MODE;
LOCK TABLES
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...
lock_type:
READ [LOCAL]
| [LOW_PRIORITY] WRITE
UNLOCK TABLES
MVCC
SELECT
Подсистема InnoDB должна проверить каждую строку, чтобы убедиться, что она
отвечает двум критериям:
• InnoDB должна найти версию строки, которая по крайней мере такая же старая, как
версия транзакции (то есть ее номер версии должен быть меньше или равен номеру
версии транзакции). Это гарантирует, что либо строка существовала до начала
транзакции, либо транзакция создала или изменила эту строку.
• Версия удаления строки должна быть не определена или ее значение больше, чем
версия транзакции. Это гарантирует, что строка не была удалена до начала
транзакции.
INSERT
InnoDB записывает текущий системный номер версии вместе с новой строкой.
DELETE
InnoDB записывает текущий системный номер версии как идентификатор удаления
строки.
UPDATE
InnoDB создает новую копию строки, используя системный номер версии в качестве
версии новой строки. Она также записывает системный номер версии как версию
удаления старой строки.
Конкуренция
Стратегия
блокировки Конкуренция
Накладные
расходы
Подсистемы
хранения
Уровень
таблицы Самая низкая Самые низкие
MyISAM, Merge,
Memory
Уровень строки Высокая Высокие NDB Cluster
Уровень строки
с MVCC Самая высокая Самые высокие
InnoDB, Falcon,
PBXT, solidDB
Спасибо за внимание
Павел Щербинин
p.scherbinin@corp.mail.ru

More Related Content

What's hot

MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. Russian
Rawan Qurmet
 
Новые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практикеНовые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практикеSveta Smirnova
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Tanya Denisyuk
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuningcollabock
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
Technopark
 
My sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmugMy sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmug
Andrey Tokarchuk
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9Technopark
 
поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...rit2011
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
Positive Hack Days
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...Ontico
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Badoo Development
 
бд шпора2
бд шпора2бд шпора2
бд шпора2elgin690
 
InterBase XE7: Применение Change Views для синхронизации данных
InterBase XE7: Применение Change Views для синхронизации данныхInterBase XE7: Применение Change Views для синхронизации данных
InterBase XE7: Применение Change Views для синхронизации данных
Andrew Sovtsov
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3Technopark
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?phpdevby
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 

What's hot (18)

MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. Russian
 
Новые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практикеНовые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практике
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuning
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
My sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmugMy sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmug
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9
 
поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...поиск узких мест в производительности My sql ботанический определитель. г. ру...
поиск узких мест в производительности My sql ботанический определитель. г. ру...
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
 
бд шпора2
бд шпора2бд шпора2
бд шпора2
 
InterBase XE7: Применение Change Views для синхронизации данных
InterBase XE7: Применение Change Views для синхронизации данныхInterBase XE7: Применение Change Views для синхронизации данных
InterBase XE7: Применение Change Views для синхронизации данных
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 

Viewers also liked

СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
Technopark
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
Technopark
 
СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"
Technopark
 
Curs2 poo 2016
Curs2 poo 2016Curs2 poo 2016
Curs2 poo 2016
Adrian Runceanu
 
Curs1 poo 2016
Curs1 poo 2016Curs1 poo 2016
Curs1 poo 2016
Adrian Runceanu
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
Technopark
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
Technopark
 

Viewers also liked (7)

СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
 
СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"
 
Curs2 poo 2016
Curs2 poo 2016Curs2 poo 2016
Curs2 poo 2016
 
Curs1 poo 2016
Curs1 poo 2016Curs1 poo 2016
Curs1 poo 2016
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 

Similar to СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры и хранимые процедуры"

СУБД осень 2012 лекция 5
СУБД осень 2012 лекция 5СУБД осень 2012 лекция 5
СУБД осень 2012 лекция 5Technopark
 
Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Ontico
 
Triggers для Mysql
Triggers для MysqlTriggers для Mysql
Triggers для Mysql
Иван mrRico
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюГлеб Тарасов
 
Agile Instrumentation
Agile InstrumentationAgile Instrumentation
Agile Instrumentation
Mikalai_Kardash
 
Mysql replication
Mysql replicationMysql replication
Mysql replication
Serge Tyatin
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
pgdayrussia
 
СУБД осень 2012 Лекция 4
СУБД осень 2012 Лекция 4СУБД осень 2012 Лекция 4
СУБД осень 2012 Лекция 4Technopark
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
AndreyGeonya
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Sergey Xek
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программирования
Constantin Kichinsky
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
Evgeny Kaziak
 

Similar to СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры и хранимые процедуры" (20)

СУБД осень 2012 лекция 5
СУБД осень 2012 лекция 5СУБД осень 2012 лекция 5
СУБД осень 2012 лекция 5
 
Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)
 
лекц17
лекц17лекц17
лекц17
 
лабраб 3
лабраб 3лабраб 3
лабраб 3
 
Triggers для Mysql
Triggers для MysqlTriggers для Mysql
Triggers для Mysql
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
 
Agile Instrumentation
Agile InstrumentationAgile Instrumentation
Agile Instrumentation
 
лабраб 7
лабраб 7лабраб 7
лабраб 7
 
Mysql replication
Mysql replicationMysql replication
Mysql replication
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
 
СУБД осень 2012 Лекция 4
СУБД осень 2012 Лекция 4СУБД осень 2012 Лекция 4
СУБД осень 2012 Лекция 4
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
лекц9
лекц9лекц9
лекц9
 
лабраб 6
лабраб 6лабраб 6
лабраб 6
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
бегун
бегунбегун
бегун
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программирования
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 

More from Technopark

Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
Technopark
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
Technopark
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
Technopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
Technopark
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
Technopark
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
Technopark
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
Technopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
Technopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
Technopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
Technopark
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
Technopark
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
Technopark
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
Technopark
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
Technopark
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
Technopark
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
Technopark
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
Technopark
 
Java осень 2014 занятие 2
Java осень 2014 занятие 2Java осень 2014 занятие 2
Java осень 2014 занятие 2
Technopark
 

More from Technopark (19)

Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Java осень 2014 занятие 2
Java осень 2014 занятие 2Java осень 2014 занятие 2
Java осень 2014 занятие 2
 

СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры и хранимые процедуры"

  • 2. Хранимые процедуры CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE [DEFINER = { user | CURRENT_USER }] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type
  • 3. Хранимые процедуры characteristic: COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } routine_body: Valid SQL routine statement
  • 4. Хранимые процедуры ЗА  Разделение логики с другими приложениями. Хранимые процедуры инкапсулируют функциональность; это обеспечивает связность доступа к данным и управления ими между различными приложениями.  Изоляция пользователей от таблиц базы данных. Это позволяет давать доступ к хранимым процедурам, но не к самим данным таблиц.  Обеспечивает механизм защиты.  Улучшение выполнения как следствие сокращения сетевого трафика. С помощью хранимых процедур множество запросов могут быть объединены.
  • 5. Хранимые процедуры ПРОТИВ • Повышение нагрузки на сервер баз данных в связи с тем, что большая часть работы выполняется на серверной части, а меньшая - на клиентской. • Дублирование логики своего приложения в двух местах: серверный код и код для хранимых процедур, тем самым усложняя процесс манипулирования данными. • Миграция с одной СУБД на другую (DB2, SQL Server и др.) может привести к проблемам.
  • 6. Хранимые процедуры ПРИМЕР DELIMITER // DROPPROCEDUREIF EXISTS p1// CREATE PROCEDURE `p1` () LANGUAGE SQL DETERMINISTIC SQL SECURITY DEFINER COMMENT 'A procedure' BEGIN SELECT 'Hello World !'; END// CALL p1();
  • 7. Хранимые процедуры ПРИМЕР 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 //
  • 8. Хранимые процедуры УСЛОВИЯ IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] ... [ELSE statement_list] END IF CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list] END CASE
  • 9. Хранимые процедуры LOOP [begin_label:] LOOP statement_list END LOOP [end_label] CREATE PROCEDURE doiterate(p1 INT) BEGIN label1: LOOP SET p1 = p1 + 1; IF p1 < 10 THEN ITERATE label1; END IF; LEAVE label1; END LOOP label1; SET @x = p1; END;
  • 10. Хранимые процедуры REPEAT, WHILE [begin_label:] REPEAT statement_list UNTIL search_condition END REPEAT [end_label] [begin_label:] WHILE search_condition DO statement_list END WHILE [end_label] CREATE PROCEDURE dowhile() BEGIN DECLARE v1 INT DEFAULT 5; WHILE v1 > 0 DO ... SET v1 = v1 - 1; END WHILE; END;
  • 11. Хранимые процедуры HANDLER DECLARE handler_action HANDLER FOR condition_value [, condition_value] ... statement handler_action: CONTINUE | EXIT | UNDO condition_value: mysql_error_code | SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION
  • 12. Хранимые процедуры КУРСОРЫ DECLARE cursor-name CURSOR FOR SELECT ...; OPEN cursor-name; FETCH cursor-name INTO variable [, variable]; CLOSE cursor-name; Declare vBankId integer; Declare vBankName VARCHAR(50); Declare vAddress VARCHAR(50); Declare done integer default 0; Declare BankCursor Cursor for Select`bank`.`BankId`,`bank`.`BankName`,`bank`.`Address` FROM `bank`; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; Open BankCursor; WHILE done = 0 DO FETCH BankCursor INTO vBankId,vBankName,vAddress; END WHILE; Close BankCursor;
  • 13. Хранимые процедуры EXECUTE EXECUTE stmt_name [USING @var_name [, @var_name] ...] DELIMITER $$ DROP PROCEDURE IF EXISTS `create_archive`$$ CREATE PROCEDURE `create_archive`(IN current_table VARCHAR(50)) BEGIN DECLARE template,archive_template VARCHAR(50); SET archive_template=replace(curdate(),"-",""); SET template=CONCAT(current_table,"_",archive_template); SET @archive_query:=CONCAT("CREATE TABLE ",template," ENGINE=ARCHIVE AS (SELECT * FROM ",current_table," )"); PREPARE archive_query FROM @archive_query; EXECUTE archive_query; DEALLOCATE PREPARE archive_query; END$$
  • 14. Триггеры CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body trigger_time = BEFORE | AFTER trigger_event = INSERT | UPDATE | DELETE
  • 15. Триггеры (Пример) CREATE TRIGGER add_count_comment AFTER INSERT ON comments FOR EACH ROW BEGIN UPDATE user SET user.countcomment=user.countcomment+1 WHERE user.id = NEW.user_id;
  • 16. Триггеры (Пример) CASE NEW.owner_name WHEN 'Blog' THEN UPDATE blog SET comment = comment+1 WHERE id = NEW.owner_id ; WHEN 'Article' THEN UPDATE article SET comment = comment+1 WHERE id = NEW.owner_id ; WHEN 'PopulatePlace' THEN UPDATE populate_place SET comment = comment+1 WHERE id = NEW.owner_id ; END CASE;
  • 17. Триггеры (Пример) CASE NEW.owner_name WHEN 'Blog' THEN SET usertitle = ( select title from blog where id=NEW.owner_id ); WHEN 'Article' THEN SET usertitle = ( select title from article where id=NEW.owner_id ); WHEN 'PopulatePlace' THEN SET usertitle = ''; END CASE; INSERT INTO user_has_events VALUES (NEW.user_id, NEW.id, "Comments", NOW() , usertitle ); END
  • 19. Транзакции START TRANSACTION; SELECT balance FROM checking WHERE customer_id = 10233276; UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276; UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276; COMMIT;
  • 20. ACID • Atomicity (Атомарность) Транзакция должна функционировать как единая неделимая еденица работы таким образом, чтобы вся транзакция была либо выполнена, либо отменена. • Consistency (Непротиворечивость) База данных должна всегда переходить из одного непротиворечивого состояния в последующее. • Isolation (Изолированность) Результаты транзакции обычно невидимы другим транзакциям, пока она не закончена. • Durability (Долговечность) Будучи зафиксированы, внесенные в ходе транзакции изменения становятся постоянными. Это означает, что изменения должны быть записаны так, чтобы данные не могли быть потеряны в случае сбоя системы.
  • 21. Уровни изоляции Уровень изоляции Возможность чернового чтения Возможность невоспроизво димого чтения Возможность фантомного чтения Блокировка чтения READ UNCOMMITTED Да Да Да Нет READ COMMITTED Нет Да Да Нет REPEATABLE READ Нет Нет Да Нет SERIALIZABLE Нет Нет Нет Да
  • 22. Уровни изоляции Уровень изоляции Возможность чернового чтения Возможность невоспроизво димого чтения Возможность фантомного чтения Блокировка чтения READ UNCOMMITTED Да Да Да Нет READ COMMITTED Нет Да Да Нет REPEATABLE READ Нет Нет Да Нет SERIALIZABLE Нет Нет Нет Да
  • 23. Взаимоблокировки Транзакция #1 START TRANSACTION; UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = 2002-05-01; UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = 2002-05-02; COMMIT; Транзакция #2 START TRANSACTION; UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = 2002-05-02; UPDATE StockPrice SET high = 47.20 WHERE stock_id = 4 and date = 2002-05-01; COMMIT;
  • 24. Ручные блокировки SELECT ... FOR UPDATE; SELECT ... LOCK IN SHARE MODE; LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ... lock_type: READ [LOCAL] | [LOW_PRIORITY] WRITE UNLOCK TABLES
  • 25. MVCC SELECT Подсистема InnoDB должна проверить каждую строку, чтобы убедиться, что она отвечает двум критериям: • InnoDB должна найти версию строки, которая по крайней мере такая же старая, как версия транзакции (то есть ее номер версии должен быть меньше или равен номеру версии транзакции). Это гарантирует, что либо строка существовала до начала транзакции, либо транзакция создала или изменила эту строку. • Версия удаления строки должна быть не определена или ее значение больше, чем версия транзакции. Это гарантирует, что строка не была удалена до начала транзакции. INSERT InnoDB записывает текущий системный номер версии вместе с новой строкой. DELETE InnoDB записывает текущий системный номер версии как идентификатор удаления строки. UPDATE InnoDB создает новую копию строки, используя системный номер версии в качестве версии новой строки. Она также записывает системный номер версии как версию удаления старой строки.
  • 26. Конкуренция Стратегия блокировки Конкуренция Накладные расходы Подсистемы хранения Уровень таблицы Самая низкая Самые низкие MyISAM, Merge, Memory Уровень строки Высокая Высокие NDB Cluster Уровень строки с MVCC Самая высокая Самые высокие InnoDB, Falcon, PBXT, solidDB
  • 27. Спасибо за внимание Павел Щербинин p.scherbinin@corp.mail.ru