DROP PROCEDURE

DROP PROCEDURE elimina un procedimiento almacenado de la base de datos. Una vez eliminado, no se puede recuperar a menos que tengas un respaldo de la definición. Si solo necesitas modificar las características del procedimiento sin eliminarlo, usa ALTER PROCEDURE.

A diferencia de los datos en tablas (que se pueden recuperar con backups o logs binarios), la definición de un procedimiento eliminado desaparece completamente del catálogo de la base de datos. Por eso es buena práctica guardar siempre las definiciones de los procedimientos en archivos SQL versionados, no solo en la base de datos.

Sintaxis

-- Eliminar un procedimiento
DROP PROCEDURE nombre_procedimiento;
 
-- Eliminar si existe (evita error)
DROP PROCEDURE IF EXISTS nombre_procedimiento;

La forma con IF EXISTS es la más segura y la recomendada en la mayoría de los casos. Sin ella, intentar eliminar un procedimiento que no existe genera un error que puede interrumpir la ejecución de scripts.

Ejemplo básico

-- Crear un procedimiento
DELIMITER //
 
CREATE PROCEDURE sp_test()
BEGIN
    SELECT 'Hola mundo' AS mensaje;
END //
 
DELIMITER ;
-- Verificar que existe
CALL sp_test();
mensaje
Hola mundo
-- Eliminar
DROP PROCEDURE sp_test;
 
-- Intentar llamarlo genera error
-- CALL sp_test();
-- Error: PROCEDURE tienda_mysql.sp_test does not exist

Una vez eliminado, cualquier código que intente llamar al procedimiento fallará. Esto incluye otros procedimientos que lo llamen internamente, triggers que lo invoquen, o eventos programados. Antes de eliminar un procedimiento, asegúrate de que no haya dependencias que se rompan.

IF EXISTS

La diferencia entre las dos formas es cómo manejan el caso de que el procedimiento no exista:

-- Sin IF EXISTS: error si no existe
-- DROP PROCEDURE sp_inexistente;
-- Error: PROCEDURE tienda_mysql.sp_inexistente does not exist
 
-- Con IF EXISTS: solo warning
DROP PROCEDURE IF EXISTS sp_inexistente;
-- Query OK, 0 rows affected, 1 warning
 
SHOW WARNINGS;
LevelCodeMessage
Note1305PROCEDURE tienda_mysql.sp_inexistente does not exist

El warning no interrumpe la ejecución del script, lo cual es crucial en scripts de migración o inicialización que pueden ejecutarse varias veces. IF EXISTS hace que el DROP sea idempotente: puedes ejecutarlo tantas veces como quieras sin que falle, lo que lo hace seguro para automatización.

Verificar antes de eliminar

Si quieres confirmar que un procedimiento existe antes de eliminarlo, puedes consultarlo de varias formas:

-- Listar todos los procedimientos
SHOW PROCEDURE STATUS WHERE Db = 'tienda_mysql';
-- Buscar un procedimiento específico
SELECT ROUTINE_NAME, CREATED, LAST_ALTERED
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = 'tienda_mysql'
AND ROUTINE_TYPE = 'PROCEDURE'
AND ROUTINE_NAME = 'sp_test';

Si la consulta devuelve filas, el procedimiento existe. Si no devuelve nada, ya fue eliminado o nunca se creó.

Guardar definición antes de eliminar

Antes de eliminar un procedimiento que puedas necesitar en el futuro, guarda su definición completa:

-- Ver la definición completa
SHOW CREATE PROCEDURE nombre_procedimiento\G

Guarda la salida en un archivo SQL antes de eliminar. Esto es especialmente importante en entornos de producción donde recrear un procedimiento incorrecto puede afectar a las aplicaciones que lo usan.

En un flujo de trabajo profesional, las definiciones de los procedimientos deberían estar versionadas en el repositorio de código (en archivos .sql dentro de una carpeta de migraciones), no solo en la base de datos. Esto permite auditar cambios, hacer rollbacks y reproducir el esquema en cualquier entorno.

Permisos necesarios

Para eliminar un procedimiento necesitas el privilegio ALTER ROUTINE en el procedimiento o en la base de datos:

-- Verificar permisos
SHOW GRANTS FOR CURRENT_USER();

Si eres el DEFINER del procedimiento (el usuario que lo creó), automáticamente tienes permiso para eliminarlo. Los administradores con permisos globales también pueden eliminar cualquier procedimiento.

Eliminar y recrear

Como MySQL no soporta CREATE OR REPLACE PROCEDURE (a diferencia de las vistas, que sí tienen CREATE OR REPLACE VIEW), el patrón estándar para actualizar un procedimiento es eliminar y recrear:

DROP PROCEDURE IF EXISTS sp_productos_activos;
 
DELIMITER //
 
CREATE PROCEDURE sp_productos_activos()
BEGIN
    SELECT nombre, precio, stock
    FROM productos
    WHERE activo = TRUE
    ORDER BY nombre;
END //
 
DELIMITER ;

Este patrón es el que encontrarás en prácticamente todos los scripts de migración y despliegue. El DROP IF EXISTS garantiza que el script funcione tanto si el procedimiento existe como si no, y el CREATE lo recrea con la definición actualizada.

La desventaja de este enfoque es que el DROP elimina los permisos EXECUTE que se hubieran concedido al procedimiento anterior. Si tenías GRANT EXECUTE ON PROCEDURE sp_productos_activos TO 'app_user', después del DROP + CREATE necesitas volver a otorgar ese permiso. Para una explicación completa de la gestión de permisos, consulta el artículo sobre control de acceso.

DROP PROCEDURE vs DROP FUNCTION

Son comandos diferentes para objetos diferentes. No son intercambiables:

ComandoElimina
DROP PROCEDUREProcedimientos almacenados
DROP FUNCTIONFunciones almacenadas

Intentar eliminar una función con DROP PROCEDURE (o viceversa) genera un error, incluso si tienen el mismo nombre.

En el siguiente artículo veremos cómo modificar las características de un procedimiento con ALTER PROCEDURE.

Escrito por Eduardo Lázaro