Група характеристик збережених процедур

Синтаксис збережених процедур допускає використання наступних характеристик characteristic У визначенні CREATE PROCEDURE та CREATE FUNCTION:

LANGUAGE SQL

| [NOT] DETERMINISTIC

| SQL SECURITY {DEFINER | INVOKER}

|COMMENT 'string'

Дані ключові слова описують характеристики збережених процедур і функцій. Вони розміщуються після списку параметрів, але до початку тіла збереженої процедури. Характеристика LANGUAGE SQL поки не має особливого сенсу і повідомляє, що процедура написана на мові SQL (приклад).

Приклад:

CREATE PROCEDURE characteristics ()

LANGUAGE SQL

BEGIN

SELECT RAND();

END //

У наступних версіях MySQL планується надати можливість створення збережених процедур з використанням мови, відмінної від SQL. Швидше за все, одним з перших підтримуваних мов стане РНР, т. к. базовий механізм РНР невеликий за розмірами, безпечний у відношенні потоків і легко вбудовується. Рекомендується використовувати ключове слово LANGUAGE SQL вже зараз для забезпечення сумісності з майбутніми версіями MySQL та іншими СУБД.

Ключове слово DETERMINISTIC дозволяє повідомити оптимізатору, що процедура завжди повертає один і той же результат для одних і тих самих вхідних параметрів, в іншому випадку слід використовувати ключове слово NOT DETERMINISTIC (приклад).

Приклад:

CREATE PROCEDURE characteristics ()

LANGUAGE SQL

NOT DETERMINISTIC

BEGIN

SELECT RAND();

END //

Зауваження:

  • На даний момент ключове слово DETERMINISTIC розпізнається, але не використовується оптимізатором MySQL.

Ключове слово SQL SECURITY може бути записано в двох формах: SQL SECURITY DEFINER і SQL SECURITY INVOKER. Якщо використовується форма SQL SECURITY DEFINER, то процедура викликається з привілеями користувача, що створив її, при використанні SQL SECURITY INVOKER процедура викликається з привілеями користувача, що викликає процедуру оператором CALL (приклад).

Приклад:

CREATE PROCEDURE characteristics ()

LANGUAGE SQL

NOT DETERMINISTIC

SQL SECURITY INVOKER

BEGIN

SELECT RAND();

­END //

Зауваження:

  • Якщо ключове слово SQL SECURITY не вказано, за замовчуванням встановлюється режим SQL SECURITY DEFINER-Процедура виконується з привілеями створившого користувача.

Для виконання процедури, і її власник, і її користувач повинні мати доступ до бази даних, в якій збережена процедура, крім того, вони обоє повинні мати привілей EXECUTE, незалежно від того, в якій формі використано ключове слово SQL SECURITY.

Ключове слово comment (наступний приклад) дозволяє позначити процедуру коротким описом, який відобразить оператор SHOW CREATE PROCEDURE і SHOW CREATE FUNCTION.

Зауваження:

  • Ключове слово COMMENT є розширенням MySQL і може не підтримуватися іншими СУБД.

Приклад:

CREATE PROCEDURE characteristics ()

LANGUAGE SQL

NOT DETERMINISTIC

SQL SECURITY INVOKER

COMMENT 'Функція повертає випадкове значення'

BEGIN

SELECT RAND();

END //

SHOW CREATE PROCEDURE characteristics//

Procedure: characteristics sql_mode:

Create Procedure: CREATE PROCEDURE 'shop*.'characteristics'()

SQL SECURITY INVOKER

COMMENT * Функция возвращает случайное значение'

BEGIN

SELECT RAND();

END