2010-06-12 80 views
14

¿Existe una declaración que pueda eliminar todos los procedimientos almacenados en MySQL? alternativa (si el primero no es posible), ¿existe tal cosa como procedimientos almacenados temporales en MySQL? Algo similar a las tablas temporales?Eliminar todos los procedimientos almacenados en MySQL o usar procedimientos almacenados temporales

+0

Hola, aunque suene divertido :)) pero es algo que me prestó MS SQL Server (http://msdn.microsoft.com/en-us/library/aa174792(SQL.80).aspx) que dice que "SQL Server 2000 también admite procedimientos almacenados temporales que, al igual que las tablas temporales, se eliminan automáticamente al desconectarse". Pero mi propósito es que todo se elimine después de la sesión, aunque todavía tengo planes de copia de seguridad como usar el lenguaje para repetir los nombres de los procedimientos almacenados y soltarlos uno por uno (no he comprobado si es posible). –

+0

@ebyrob - Tienes razón. MySQL no admite bloques anónimos de código de procedimiento. Mis comentarios reflejaron una transferencia no válida de Oracle DBMS que permite la ejecución de código de procedimiento arbitrario sin definir los procesos almacenados permanentes – APC

Respuesta

19

Dado que DROP PROCEDURE y DROP FUNCTION no permiten sub selecciones, pensé que sería posible realizar la operación a través de otro procedimiento almacenado, pero desafortunadamente, MySQL no permite que los procedimientos almacenados abandonen otros procedimientos almacenados.

Traté de engañar a MySQL a esto de todos modos creando declaraciones preparadas y separando así la llamada del procedimiento almacenado, pero no he tenido suerte.

Por lo tanto, mi única contribución es esta declaración de selección que crea una lista de los enunciados necesarios para eliminar todos los procedimientos y funciones almacenados.

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

ESTO CREARÁ LA FUNCIÓN DE CAÍDA PARA TODOS LOS ESQUEMAS DE BASE DE DATOS DISPONIBLES. ¡USE CON PRECAUCIÓN! – Dasun

3

que pueda casi consigo trabajar un pedazo de código para retirar todos los procedimientos almacenados, pero creo que MySQL no me deja utilizar un bucle o un cursor fuera de un procedimiento almacenado.

puedo escribir un archivo SQL que cuenta el número de procedimientos almacenados para un esquema determinado, y no tengo el código para iterar a través de los procedimientos de mesa y soltar, pero no puedo conseguir que se ejecute:

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; 
+0

¡Gracias por la idea que ayudará a los futuros usuarios! No estoy seguro de cómo se debe abordar este problema en el cursor/loop ... –

+0

@Kenston: finalmente escribí un script MySQL que genera SQL que soltará los procs, por lo que la salida se puede transferir nuevamente a mysql. – phyzome

+0

¡Genial! ¡Gracias por el seguimiento! –

21

yo habría pensado que esto lo haría, pero estoy abierto a correcciones:

(Editado para incorporar un buen punto proporcionada en los comentarios)

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

(Como se ha señalado b y Balmipour en los comentarios a continuación, es una buena idea especificar la base de datos.)

Creo que es válido querer abandonar todos los procedimientos en una base de datos dada; de lo contrario, en un largo ciclo de desarrollo existe el peligro de procedimientos y funciones obsoletos acumulando y enlodando todo.

+0

¡Funciona para mí! ¡Mucho más simple de implementar! :) –

+1

@ user1070300 Me temo que ESTO DESTRUIRÁ TODOS LOS PROCEDIMIENTOS **, incluidos los MySQL **, que no están relacionados con su base de datos, y los procedimientos de todas las bases si tiene varias en su servidor. Considere añadir un "WHERE db LIKE " a esta solicitud, ya que ** parece bastante peligroso ** tal como está. – Balmipour

+0

@Balmipour Un buen punto, aunque ya no responde a la solicitud original, que fue una declaración que puede eliminar todos los procedimientos almacenados en MySQL. – user1070300

1

después de la instrucción de selección que crea una lista de las instrucciones necesarias para eliminar todos los procedimientos y funciones almacenados. Puede evitar el trabajo manual de copia pegar las consultas citadas del modo siguiente:

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

Gracias por la idea, aunque esto debería haberse colocado como comentario a la respuesta aceptada. De hecho, ejecuto esto usando Java, pero esto aún puede ser útil para otros. –

+0

Las personas ignoran los comentarios que me incluyen y tampoco son demasiado notables. –

8

Esto parece caer los procedimientos ... no estoy seguro acerca de las implicaciones aunque

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

@ respuesta de user1070300 parece funcionar, pero parece que puede soltar muchas cosas.

Una rápida DESC mysql.proc; me llevó a agregar un DONDE a mi solicitud, a fin de evitar los procedimientos MySQL ya existentes, que tenía, por supuesto, no hay razón para perder.

ejecuté DELETE FROM mysql.proc WHERE db NOT LIKE 'mysql';
Si tiene varias bases y quiere apuntar solo a una, use DELETE FROM mysql.proc WHERE db LIKE '<yourDbName>';

Por cierto, si como yo, están limpiando por completo su base de datos y necesita dejar también sus tablas, puede utilizar esta secuencia de comandos shell de Linux: mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done (ver Truncate all tables in a MySQL database in one command? para más detalles)

Truncate all tables in a MySQL database in one command?

+0

Si está borrando toda su base de datos, ¿no es más fácil simplemente descartar y volver a crear su esquema? – Manatax

+0

@manatax Puede ser, por supuesto, pero aunque no los recuerdo, creo que tuve buenas razones para no utilizar este enfoque. Los derechos faltantes para hacerlo podrían haber sido uno. No querer meterse con otras configuraciones de base de datos es otra. (Dudo que los usuarios se verán afectados, pero estoy seguro de que algunos aspectos lo harían). No juego con eso lo suficiente como para darte una respuesta más precisa, de todos modos, el objetivo principal de mi respuesta fue: ** ¡No elimines ciegamente todo, agrega una declaración 'where'! ** (Estoy feliz la respuesta fue editada para tener esto en cuenta) – Balmipour

0

Uso select statement para mostrar todas las declaraciones de Drop Procedure de una base de datos específica en una celda. Luego cópialo a la ventana de consulta.

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; 
Cuestiones relacionadas