MySQL: i-am-a-dummy

Hay veces que MySQL todavía puede sorprendernos y ofrecernos un hueco de protección para aquellas personas que hacen actualizaciones (UPDATE) o borrados (DELETE) muy bruscos. Dicha opción safe-updates, o su alias, i-am-a-dummy. Como su propia traducción indica, al arrancar el prompt de mysql se entra en un modo especial para dummy's que limita las sentencias UPDATE y DELETE a usar una clausula WHERE sobre una columna con índice. Esto es especialmente útil para evitar aquellas consultas demasiado agresivas o peligrosas que puedan poner en peligro la integridad de los datos, eliminando por ejemplo el contenido de toda una tabla sin quererlo.
shell> mysql -u root --i-am-a-dummy -p
Enter password:

mysql> use test;
Database changed

mysql> CREATE TABLE `prueba` (
    ->   `id` int(11) DEFAULT NULL
    -> );

mysql> insert into prueba (id) values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into prueba (id) values(2);
Query OK, 1 row affected (0.00 sec)

mysql> select * from prueba;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

mysql> delete from prueba;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql> delete from prueba where id=1;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
Como se puede observar, la columna id no tiene un índice, por lo que no se permite realizar un borrado de los datos.
A continuación, creamos el índice sobre dicha tabla y volvemos a ejecutar la sentencias de DELETE.
mysql> create index ids on prueba(id);
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> delete from prueba;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql> delete from prueba where id=1;
Query OK, 1 row affected (0.00 sec) 
Como se puede observar, ahora al llevar la clausula WHERE sí que permite eliminar datos, sin la clausula restrictiva, no.
Internamente la opción i-am-a-dummy lo que realmente hace es establecer unos valores predeterminados a ciertas variables del servidor, las que se muestran a continuación.
mysql> show variables like '%sql_max_join_size%';
+-------------------+---------+
| Variable_name     | Value   |
+-------------------+---------+
| sql_max_join_size | 1000000 |
+-------------------+---------+
1 row in set (0.00 sec)

mysql> show variables like '%sql_select_limit%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_select_limit | 1000  |
+------------------+-------+
1 row in set (0.00 sec)

mysql> show variables like '%sql_safe_updates%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | ON    |
+------------------+-------+
1 row in set (0.00 sec)
El significado de estas son:
  • SQL_SELECT_LIMIT
    Las sentencias a una sola tabla están limitadas a un máximo de 1000 filas, exceptuando que se use la cláusula LIMIT.
  • SQL_MAX_JOIN_SIZE
    Las sentencias que afecten a varias tablas, están limitadas a un máximo de 1000000 de registros.
  • SQL_SAFE_UPDATES
    Establece la limitación en las clausulas UPDATE y DELETE.


No hay comentarios :

Publicar un comentario

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios