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ísticaDescripción
COMMENTTexto descriptivo del procedimiento
SQL SECURITYDEFINER o INVOKER
Característica SQLCONTAINS 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_NAMEROUTINE_COMMENT
sp_ejemploCuenta 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;
ModoComportamiento
DEFINERSe ejecuta con los permisos del usuario que creó el procedimiento
INVOKERSe 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ísticaSignificado
CONTAINS SQLContiene sentencias SQL pero no lee ni modifica datos
NO SQLNo contiene sentencias SQL
READS SQL DATASolo lee datos con SELECT
MODIFIES SQL DATAPuede 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 ROUTINE en 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