MySQL 8 - удалить все хранимые процедуры в определенной базе данных - PullRequest
0 голосов
/ 08 ноября 2018

В MySQL 8 таблица базы данных `mysql` .proc` не существует. Ранее я использовал эту таблицу для удаления / удаления / очистки всех хранимых процедур и воссоздания их из исходного версионного кода. Это очень хорошо работает для того, чтобы убедиться, что хранимые процедуры разработки сохранены в версиях исходного кода перед началом работы.

В версиях MySQL до 8 этот запрос SQL работал.

УДАЛИТЬ ИЗ `mysql``proc` WHERE` type` = 'PROCEDURE' AND `db` = 'test';

Есть ли альтернативный способ получения результатов запроса в одном выражении?

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

В MySQL 8.0 подробности хранимой процедуры (подпрограммы) доступны через таблицу Подпрограммы в INFORMATION_SCHEMA. Следующие пункты заслуживают внимания:

Таблица ROUTINES предоставляет информацию о сохраненных подпрограммах (сохранено процедуры и хранимые функции). Таблица ROUTINES не включает встроенные функции SQL или пользовательские функции (UDF).

Теперь для использования здесь необходимы следующие два столбца в таблице процедур:

ROUTINE_SCHEMA - Имя схемы (базы данных), которой принадлежит подпрограмма.

ROUTINE_TYPE - ПРОЦЕДУРА для хранимых процедур, ФУНКЦИЯ для хранимых функций.

При дальнейшем расследовании с использованием SHOW CREATE TABLE information_schema.routines выясняется, что это TEMPORARY TABLE

Итак, чтобы удалить все хранимые процедуры (и не хранимые функции) из базы данных test, мы можем использовать следующий запрос:

DELETE FROM information_schema.routines 
WHERE routine_type = 'PROCEDURE' AND 
      routine_schema = 'test'

0 голосов
/ 03 декабря 2018

Я предлагаю использовать MySQL Shell - в следующем примере используется режим Python:

mysqlsh> \py

mysql-py> i_s = session.get_schema("information_schema")

mysql-py> functions = i_s.ROUTINES \
       ->                .select("sys.quote_identifier(ROUTINE_SCHEMA) AS RoutineSchema", "sys.quote_identifier(ROUTINE_NAME) AS RoutineName") \
       ->                .where("ROUTINE_SCHEMA = 'db1' AND ROUTINE_TYPE = 'FUNCTION'").execute().fetch_all()

mysql-py> functions
[
    [
        "`db1`",
        "`func1`"
    ], 
    [
        "`db1`",
        "`func2`"
    ], 
    [
        "`db1`",
        "`func``3`"
    ]
]

mysql-py> for function in functions:
       ->     print(sql_fmt.format(*function))
       ->     session.sql(sql_fmt.format(*function)).execute()
       ->
DROP FUNCTION `db1`.`func1`
DROP FUNCTION `db1`.`func2`
DROP FUNCTION `db1`.`func``3`
Query OK, 0 rows affected (0.0684 sec)

Подробнее см. Также https://mysql.wisborg.dk/2018/12/02/mysql-8-drop-several-stored-events-procedures-or-functions/.

0 голосов
/ 09 ноября 2018

попробуй

   delete from mysql.proc WHERE db LIKE <yourDbName>;
...