Есть ли инструкция, которая может удалить все хранимые процедуры в MySQL? Альтернативно (если первый невозможен), существует ли такая вещь, как временные хранимые процедуры в MySQL? Что-то похожее на временные таблицы?
Удаление всех хранимых процедур в MySQL или использование временных хранимых процедур
Ответ 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 в одной команде? для получения более подробной информации)
Ответ 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;