sql >> Database >  >> RDS >> Mysql

Een kolomnaam als parameter doorgeven aan een opgeslagen procedure in mySQL

U zou dynamische SQL moeten gebruiken :

DELIMITER //
CREATE PROCEDURE myDB.edit_myTable(
    IN key CHAR(16), 
    IN col VARCHAR(100), 
    new_value  VARCHAR(200)
)
BEGIN
    SET @s = CONCAT(
        'UPDATE myDB.myTable SET `', 
         col, '` = ', QUOTE(new_value),
         ' WHERE key = ', QUOTE(key)
    );
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END
//
DELIMITER;

Houd er rekening mee dat, zoals opgemerkt door Paul Spiegel , creëert het gebruik van een variabele voor de kolomnaam een ​​risico op SQL-injectie. Een oplossing voor het verbeteren van de beveiliging zou zijn om ervoor te zorgen dat de invoer col bestaat in de doeltabel, met behulp van MySQL-informatieschema:

DELIMITER //
CREATE PROCEDURE myDB.edit_myTable(
    IN key CHAR(16), 
    IN col VARCHAR(100), 
    new_value  VARCHAR(200)
)
BEGIN
    DECLARE col_exists INT;

    SELECT COUNT(*) INTO col_exists 
    FROM  information_schema.COLUMNS
    WHERE TABLENAME = 'mytable' AND COLUMN_NAME = col;

    IF (col_exists != 1) THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = CONCAT('Column ', col, ' does not exist in table mytable');
    END IF;

    SET @s = CONCAT(
        'UPDATE myDB.myTable SET `', 
         col, '` = ', QUOTE(new_value),
         ' WHERE key = ', QUOTE(key)
    );
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END
//
DELIMITER;



  1. Ontsnappen aan MYSQL-opdrachtregels via Bash Scripting

  2. het parseren van door de gebruiker getypte Full Text Search-query's in de WHERE-clausule van MySQL met behulp van PHP

  3. Invoegen met LEFT JOIN en INNER JOIN

  4. SQL SELECT SUM