Conceptos Esenciales de MySQL: Funciones, Vistas, Triggers y Gestión de Datos

Clasificado en Informática

Escrito el en español con un tamaño de 8,89 KB

Programación Almacenada en MySQL

Función para Comparar Números Enteros

Se requiere una función que acepte dos números enteros, los compare y devuelva una cadena de texto indicando cuál es mayor, menor o si son iguales.


DELIMITER $$
CREATE FUNCTION comparar_numeros(num1 INT, num2 INT)
RETURNS VARCHAR(50)
DETERMINISTIC
BEGIN
    DECLARE resultado VARCHAR(50);
    IF num1 > num2 THEN
        SET resultado = CONCAT(num1, ' es mayor que ', num2);
    ELSEIF num1 < num2 THEN
        SET resultado = CONCAT(num1, ' es menor que ', num2);
    ELSE
        SET resultado = CONCAT(num1, ' es igual a ', num2);
    END IF;
    RETURN resultado;
END$$
DELIMITER ;

Procedimiento para Gestionar Personas (Niños y Adultos)

Para gestionar personas según su edad, se crearán dos tablas y un procedimiento almacenado que capture el nombre y la edad de una persona y almacene sus datos en la tabla correspondiente.

Creación de Tablas


CREATE TABLE ninios (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(50) NOT NULL,
    edad INT NOT NULL
) ENGINE=InnoDB;

CREATE TABLE adultos (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(50) NOT NULL,
    edad INT NOT NULL
) ENGINE=InnoDB;

Procedimiento Almacenado para Introducir Personas


DELIMITER $$
CREATE PROCEDURE introducir_persona(IN p_nombre VARCHAR(50), IN p_edad INT)
BEGIN
    IF p_edad < 18 THEN
        INSERT INTO ninios (nombre, edad) VALUES (p_nombre, p_edad);
    ELSE
        INSERT INTO adultos (nombre, edad) VALUES (p_nombre, p_edad);
    END IF;
END$$
DELIMITER ;

Función para Calcular Antigüedad de un Jugador

Se necesita una función almacenada que calcule la antigüedad en años de un jugador específico basándose en su fecha de alta.


DELIMITER $$
CREATE FUNCTION calcular_antiguedad_jugador(p_id_jugador INT)
RETURNS INT
DETERMINISTIC
BEGIN
    DECLARE fecha_alta_jugador DATE;
    DECLARE dias_transcurridos INT;
    DECLARE anos_antiguedad INT;

    SELECT fecha_alta INTO fecha_alta_jugador
    FROM jugador
    WHERE id_jugador = p_id_jugador;

    SET dias_transcurridos = DATEDIFF(NOW(), fecha_alta_jugador);
    SET anos_antiguedad = FLOOR(dias_transcurridos / 365);

    RETURN anos_antiguedad;
END$$
DELIMITER ;

Vistas de Base de Datos

Vista de Información de Clientes y Cuentas

Se solicita crear una vista que combine la información esencial de los clientes (DNI, nombre y apellidos) con los detalles de sus cuentas (fecha de creación, saldo).


CREATE VIEW informacion_clientes_cuentas AS
SELECT
    c.dni,
    c.nombre,
    CONCAT(c.apellido1, ' ', c.apellido2) AS apellidos,
    cu.fecha_creacion AS fecha_de_creacion_cuenta,
    cu.saldo
FROM
    cliente c
INNER JOIN
    cuentas cu ON c.codigo_cliente = cu.cod_cliente;

Vista de Datos de Capitanes y Equipos

Se requiere una vista que muestre la información detallada de los capitanes de equipo, incluyendo sus datos personales (DNI, nombre y apellidos en una sola columna) y los de su equipo (nombre, ciudad).


USE liga;
DELIMITER $$
CREATE VIEW vista_capitanes_equipo AS
SELECT
    j.dni,
    CONCAT(j.nombre, ' ', j.apellido1, ' ', j.apellido2) AS nombre_completo_jugador,
    e.nombre AS nombre_equipo,
    e.ciudad
FROM
    jugador j
INNER JOIN
    equipo e ON j.id_jugador = e.id_capitan;
END$$
DELIMITER ;

Triggers y Variables de Usuario

Explicación de un Trigger de Actualización de Saldo

El siguiente trigger está diseñado para mantener la consistencia del saldo de una cuenta bancaria.


DELIMITER $$
CREATE TRIGGER act_cuenta
AFTER INSERT ON movimiento
FOR EACH ROW
BEGIN
    UPDATE Cuenta
    SET saldo = saldo + NEW.cantidad
    WHERE cod_cuenta = NEW.cod_cuenta;
END$$
DELIMITER ;

Explicación: Este trigger se ejecuta automáticamente después de cada inserción en la tabla movimiento. Su función es actualizar el saldo de la cuenta correspondiente, sumando la cantidad del nuevo movimiento al saldo existente.

Uso y Alcance de Variables de Usuario

A continuación, se muestra cómo crear y utilizar una variable de usuario en MySQL, junto con una explicación de su alcance.

Creación y Visualización


SET @mi_variable_usuario = 1;
SELECT @mi_variable_usuario;

Alcance de la Variable

Las variables de usuario (precedidas por @) no son variables de sesión ni globales en el sentido estricto. Son variables específicas de la conexión actual del usuario. Esto significa que:

  • Su valor es visible y modificable solo dentro de la sesión en la que fueron creadas.
  • Desaparecen automáticamente cuando la conexión del usuario finaliza.

Gestión de Usuarios y Privilegios

Configuración de Cuentas de Superusuario en MySQL

Para asegurar la conectividad y gestión de usuarios en MySQL, es común configurar múltiples cuentas con diferentes alcances. Consideremos el siguiente escenario:

Se han configurado dos cuentas de superusuario con el nombre de usuario "nuevo" y la contraseña "pass_nuevo". Ambas poseen ALL PRIVILEGES, otorgándoles permisos completos para realizar cualquier operación en el servidor.

  • La primera cuenta está configurada para permitir la conexión exclusivamente desde el equipo local ('nuevo'@'localhost').
  • La segunda cuenta permite la conexión desde cualquier otro equipo ('nuevo'@'%').

Es fundamental tener ambas cuentas. Si solo existiera la cuenta 'nuevo'@'%', al intentar conectarse desde el equipo local, la cuenta anónima para localhost (creada por mysql_install_db) tendría precedencia. Esto se debe a que la cuenta anónima tiene un valor más específico en la columna Host de la tabla user, lo que la sitúa antes en el orden de resolución de permisos. Como resultado, el usuario "nuevo" sería tratado como un usuario anónimo.

La cláusula WITH GRANT OPTION, al crear una cuenta, le otorga los mismos privilegios que el usuario que la crea, incluyendo la capacidad de conceder esos mismos permisos a otros usuarios.

Diccionario de Datos (INFORMATION_SCHEMA)

Tablas Clave del Diccionario de Datos

El diccionario de datos de MySQL, accesible a través de INFORMATION_SCHEMA, contiene metadatos cruciales sobre la estructura de la base de datos. A continuación, se listan cuatro tablas importantes y la información que almacenan:

  • SCHEMATA: Proporciona información detallada sobre todas las bases de datos (esquemas) disponibles en el servidor.
  • TABLES: Contiene metadatos sobre todas las tablas presentes en las bases de datos del servidor, como nombres, tipos de motor, fechas de creación, etc.
  • ROUTINES: Almacena información sobre los procedimientos y funciones almacenadas definidos en las bases de datos.
  • VIEWS: Ofrece detalles sobre las vistas creadas en las bases de datos, incluyendo su definición.

Definición y Acceso al Diccionario de Datos

El INFORMATION_SCHEMA es una base de datos especial en MySQL que actúa como el diccionario de datos. Su propósito principal es almacenar metadatos, es decir, información sobre todas las demás bases de datos, tablas, vistas, procedimientos, funciones y otros objetos que residen en el servidor MySQL.

Contiene una serie de vistas de solo lectura. Cada usuario tiene derecho a acceder a estas tablas, pero solo podrá visualizar los registros que corresponden a los objetos sobre los cuales posee permisos de acceso.

Consulta del Contenido del Diccionario de Datos

Para explorar el contenido del diccionario de datos INFORMATION_SCHEMA, se pueden utilizar las siguientes sentencias SQL:

Visualizar Tablas del INFORMATION_SCHEMA


SHOW TABLES FROM information_schema;

Esta consulta mostrará todas las tablas y vistas disponibles dentro de la base de datos information_schema.

Consultar Metadatos de Tablas Específicas (Ej. de la BD mysql)

Si se desea filtrar la información, por ejemplo, para ver las tablas del diccionario de datos relacionadas con la base de datos mysql (que también contiene metadatos importantes), se puede usar:


SELECT *
FROM information_schema.tables
WHERE table_schema = 'mysql';

Entradas relacionadas: