Удаление всех хранимых процедур в MySQL или использование временных хранимых процедур - программирование
Подтвердить что ты не робот

Удаление всех хранимых процедур в MySQL или использование временных хранимых процедур

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

4b9b3361

Ответ 1

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

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

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

SELECT
    CONCAT('DROP ',ROUTINE_TYPE,' `',ROUTINE_SCHEMA,'`.`',ROUTINE_NAME,'`;') as stmt
FROM information_schema.ROUTINES;

Ответ 2

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

(EDITED включил хороший момент, указанный в комментариях)

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

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

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

Ответ 3

Кажется, что эти процедуры отбрасываются... не уверены в возможностях, но

DELETE FROM mysql.proc WHERE db = 'Test' AND type = 'PROCEDURE';

Ответ 4

Я могу почти сработать кусок кода, чтобы удалить все сохраненные procs, но я думаю, что 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;

Ответ 5

после оператора 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;

Ответ 6

@user1070300 Ответ, похоже, работает, но похоже, что он может потерять много вещей.

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

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

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

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

Ответ 7

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

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;