Удалите все хранимые процедуры в MySQL или используя временные хранимые процедуры - PullRequest
16 голосов
/ 12 июня 2010

Есть ли оператор, который может отбросить все хранимые процедуры в MySQL? В качестве альтернативы (если первое невозможно), существует ли такая вещь, как временные хранимые процедуры в MySQL? Что-то похожее на временные таблицы?

Ответы [ 7 ]

23 голосов
/ 28 марта 2012

Я бы подумал, что это сделает это, но я открыт для исправлений:

(отредактировано, чтобы включить в комментарии хороший пункт)

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

(Как отметил Бальмипур в комментариях ниже, неплохо было бы указать базу данных.)

Я думаю, что действительно необходимо отбросить все процедуры в данной базе данных, иначе в долгом цикле разработки существует опасность устаревания процедур и функций, накапливающих и запутывающих все.

21 голосов
/ 12 июня 2010

Поскольку DROP PROCEDURE и DROP FUNCTION не разрешают подвыборы, я подумал, что возможно выполнить операцию с помощью другой хранимой процедуры, но, увы, MySQL не позволяет хранимым процедурам удалять другие хранимые процедуры.

Я все равно пытался обмануть MySQL, создав готовые операторы и, таким образом, несколько отделив вызов отбрасывания от хранимой процедуры, но мне не повезло.

Поэтому, поэтому мой единственный вклад - это оператор выбора, которыйсоздает список операторов, необходимых для удаления всех хранимых процедур и функций.

SELECT
    CONCAT('DROP ',ROUTINE_TYPE,' `',ROUTINE_SCHEMA,'`.`',ROUTINE_NAME,'`;') as stmt
FROM information_schema.ROUTINES;
10 голосов
/ 24 мая 2013

Это, кажется, отбрасывает процедуры ... хотя и не уверен в последствиях

DELETE FROM mysql.proc WHERE db = 'Test' AND type = 'PROCEDURE';
3 голосов
/ 14 ноября 2010

Я могу почти получить кусок кода, чтобы отбросить все сохраненные процессы, но я думаю, что MySQL не позволяет мне использовать LOOP или CURSOR вне хранимой процедуры.

Я могу написать файл SQL, который подсчитывает количество хранимых процедур для данной схемы, и у меня есть код для итерации по таблице и удаления процедур, но я не могу его запустить:

SELECT COUNT(ROUTINE_NAME)
  INTO @remaining
  FROM information_schema.ROUTINES
  WHERE ROUTINE_SCHEMA = SCHEMA()
    AND ROUTINE_TYPE = 'FUNCTION';

kill_loop: LOOP
  IF @remaining < 1 THEN
    LEAVE kill_loop;
  END IF;
  SELECT ROUTINE_NAME
    INTO @cur_func_name
    FROM information_schema.ROUTINES
    WHERE ROUTINE_SCHEMA = SCHEMA()
      AND ROUTINE_TYPE = 'FUNCTION'
    LIMIT 1;
  DROP FUNCTION @cur_func_name;
  @remaining = @remaining - 1;
END LOOP;
1 голос
/ 16 января 2017

Я использую оператор SELECT для отображения всех операторов процедуры удаления определенной базы данных в одной ячейке.Затем скопируйте его в окно запроса.

SET group_concat_max_len = 4096;

SELECT GROUP_CONCAT(Procedures SEPARATOR '; ') From (SELECT CONCAT(
"DROP PROCEDURE IF EXISTS `",SPECIFIC_NAME, '`') AS Procedures 
FROM information_schema.ROUTINES R WHERE R.ROUTINE_TYPE = "PROCEDURE" 
AND R.ROUTINE_SCHEMA = 'my_database_name') As CopyThis; 
1 голос
/ 11 апреля 2012

после оператора select, который создает список операторов, необходимых для удаления всех хранимых процедур и функций. Вы можете избежать ручной работы по копированию, вставляя перечисленные запросы следующим образом:

mysql>SELECT
    CONCAT('DROP ',ROUTINE_TYPE,' `',ROUTINE_SCHEMA,'`.`',ROUTINE_NAME,'`;') as stmt
FROM information_schema.ROUTINES into outfile '/tmp/a.txt';

mysql> source /tmp/a.txt;
0 голосов
/ 07 апреля 2016

@ user1070300 ответ, кажется, работает, но, похоже, он может отбросить многие вещи.

Быстрый DESC mysql.proc; привел меня к добавлению WHERE в мой запрос, чтобы избавить от уже существующих процедур MySQL, которые я, конечно, не имел смысла отбрасывать.

я выполнил DELETE FROM mysql.proc WHERE db NOT LIKE 'mysql';
Если у вас есть несколько баз и вы хотите использовать только одну, используйте DELETE FROM mysql.proc WHERE db LIKE '<yourDbName>' вместо

Кстати, если вы, как и я, полностью очищаете свою базу данных, и вам также необходимо удалить таблицы, вы можете использовать этот скрипт оболочки Linux: mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done (см. Обрезать все таблицы в базе данных MySQL одной командой? для получения более подробной информации)

Обрезать все таблицы в базе данных MySQL одной командой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...