ALTER PROCEDURE
ALTER PROCEDURE modifica las características de un procedimiento almacenado existente. No puede modificar el cuerpo ni los parámetros del procedimiento; para eso necesitas eliminarlo y recrearlo.
Sintaxis
ALTER PROCEDURE nombre_procedimiento
[COMMENT 'texto']
[LANGUAGE SQL]
[{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }]
[SQL SECURITY { DEFINER | INVOKER }]Qué puede cambiar ALTER PROCEDURE
| Característica | Descripción |
|---|---|
| COMMENT | Texto descriptivo del procedimiento |
| SQL SECURITY | DEFINER o INVOKER |
| Característica SQL | CONTAINS SQL, NO SQL, READS SQL DATA, MODIFIES SQL DATA |
Qué NO puede cambiar
- El cuerpo del procedimiento
- Los parámetros
- El nombre
Para cambiar estos, debes usar DROP y CREATE.
Cambiar el comentario
DELIMITER //
CREATE PROCEDURE sp_ejemplo()
BEGIN
SELECT COUNT(*) AS total FROM productos;
END //
DELIMITER ;-- Añadir un comentario
ALTER PROCEDURE sp_ejemplo
COMMENT 'Cuenta el total de productos en la base de datos';-- Verificar el cambio
SELECT ROUTINE_NAME, ROUTINE_COMMENT
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = 'tienda_mysql'
AND ROUTINE_NAME = 'sp_ejemplo';| ROUTINE_NAME | ROUTINE_COMMENT |
|---|---|
| sp_ejemplo | Cuenta el total de productos en la base de datos |
Cambiar SQL SECURITY
-- Crear procedimiento con DEFINER (por defecto)
DELIMITER //
CREATE PROCEDURE sp_ver_precios()
SQL SECURITY DEFINER
BEGIN
SELECT nombre, precio FROM productos WHERE activo = TRUE;
END //
DELIMITER ;-- Cambiar a INVOKER
ALTER PROCEDURE sp_ver_precios
SQL SECURITY INVOKER;| Modo | Comportamiento |
|---|---|
| DEFINER | Se ejecuta con los permisos del usuario que creó el procedimiento |
| INVOKER | Se ejecuta con los permisos del usuario que llama al procedimiento |
Cambiar característica SQL
-- Indicar que el procedimiento solo lee datos
ALTER PROCEDURE sp_ver_precios
READS SQL DATA
COMMENT 'Lista precios de productos activos';| Característica | Significado |
|---|---|
| CONTAINS SQL | Contiene sentencias SQL pero no lee ni modifica datos |
| NO SQL | No contiene sentencias SQL |
| READS SQL DATA | Solo lee datos con SELECT |
| MODIFIES SQL DATA | Puede modificar datos con INSERT, UPDATE, DELETE |
Múltiples cambios a la vez
ALTER PROCEDURE sp_ver_precios
SQL SECURITY INVOKER
READS SQL DATA
COMMENT 'Procedimiento público para consultar precios';Patrón para modificar el cuerpo
Como ALTER PROCEDURE no puede cambiar el cuerpo, el patrón estándar es:
-- 1. Guardar la definición actual
SHOW CREATE PROCEDURE sp_ver_precios\G
-- 2. Eliminar
DROP PROCEDURE IF EXISTS sp_ver_precios;
-- 3. Recrear con los cambios
DELIMITER //
CREATE PROCEDURE sp_ver_precios()
SQL SECURITY INVOKER
READS SQL DATA
COMMENT 'Lista precios de productos activos con stock'
BEGIN
SELECT nombre, precio, stock
FROM productos
WHERE activo = TRUE AND stock > 0
ORDER BY precio;
END //
DELIMITER ;Permisos necesarios
Para usar ALTER PROCEDURE necesitas:
- Privilegio
ALTER ROUTINEen el procedimiento, o - Ser el DEFINER del procedimiento
-- Verificar el DEFINER de un procedimiento
SELECT ROUTINE_NAME, DEFINER
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = 'tienda_mysql'
AND ROUTINE_TYPE = 'PROCEDURE';Limpieza
DROP PROCEDURE IF EXISTS sp_ejemplo;
DROP PROCEDURE IF EXISTS sp_ver_precios;En el siguiente artículo veremos el control de acceso en procedimientos almacenados y cómo gestionar permisos.
Escrito por Eduardo Lázaro
