Archivo

Archivo para la categoría ‘Bases de Datos’

Reemplazando Cadenas en Tablas de MySQL

Miércoles, 10 de Junio de 2009 webmaster Sin comentarios

Si necesitas reemplazar un mismo texto en varios registros en MySQL puedes hacerlo de la siguiente manera.

MySQL:
  1. UPDATE la_tabla
  2.  SET el_campo =
  3.  REPLACE (el_campo,’texto_antiguo’,texto_nuevo’)

Esta forma es la ideal para realizar cambios de forma masiva. Leer más...

 

Categories: Bases de Datos Tags: , ,

Utilizar “case when” en SQL y Access

Miércoles, 23 de Abril de 2008 webmaster Sin comentarios

Cuando tenemos una columna en una tabla de SQL que puede contener diferentes valores y según el valor queremos mostrar un texto, número, etc. Disponemos de la sentencia CASE de SQL que tiene la sintaxis:

SQL:
  1. SELECT CASE columna
  2.   WHEN valor1 THEN 'es valor 1'
  3.   WHEN valor2 THEN 'es valor 2'
  4.   ELSE 'es valor 3'
  5.   END
  6.  FROM Tabla

Donde valor1, valor2, etc. son los valores que se encuentran almacenados en la base de datos y los textos "es valor 1", "es valor 2" Y "es valor 3" son los textos que se mostrarán en el resultado del SELECT.

Un ejemplo de ventas anuales: Leer más...

 

Categories: Bases de Datos Tags:

Diferencias Entre MyISAM y InnoDB

Jueves, 24 de Enero de 2008 webmaster Sin comentarios
  • ISAM
  • MyISAM
  • InnoDB
  • DBD (Berkeley Database)

El servidor de bases de datos MySQL soporta distintos tipos de tablas, como las antes mencionadas, de éstas, InnoDB y MyISAM merecen una atención especial y mencionaremos algunas diferencias.

Las tablas del tipo InnoDB están estructuradas de forma distinta que MyISAM, ya que se almacenan en un sólo archivo en lugar de tres, y sus principales características son que permite trabajar con transacciones, y definir reglas de integridad referencial.

Las transacciones aportan una fiabilidad superior a las bases de datos. Si disponemos de una serie de consultas SQL que deben ejecutarse en conjunto, con el uso de transacciones podemos tener la certeza de que nunca nos quedaremos a medio camino de su ejecución.

Para este fin, las tablas que soportan transacciones, como es el caso de InnoDB, son mucho más seguras y fáciles de recuperar si se produce algún fallo en el servidor, ya que las consultas se ejecutan o no en su totalidad. Por otra parte, las transacciones pueden hacer que las consultas tarden más tiempo en ejecutarse.

Por ejemplo:

Al ejecutar sentencias de modificación de datos SQL en MyISAM, y se produce algún corte en la conexión y las consultas no se han ejecutado completamente, puede que queden sólo parte de los registros actualizados y no sabremos qué registros no se han actualizado.

En cambio, utilizando InnoDB, si se produce un corte mientras se ejecuta la consulta SQL no se aplicarán los cambios y podremos volver a ejecutarla, es decir, garantiza que una transacción se ejecute íntegramente, de lo contrario la anula.

MyISAM no permite integridad referencial (uso de claves foráneas para “enlazar” varias tablas), en cambio InnoDB sí permite este tipo de relaciones.

InnoDB es más eficiente que MyISAM en cuanto a tiempos de respuesta para operaciones habituales, tales como INSERT, UPDATE, etc.

 

Categories: Bases de Datos Tags:

Inyección de código SQL

Viernes, 4 de Enero de 2008 webmaster 1 comentario

ms_sql_logo.gifYa vimos como evitar la inyección de código SQL de una forma simple.
La inyección de código SQL consiste en la modificación del comportamiento de nuestras consultas mediante la introducción de parámetros no deseados en los campos a los que tiene acceso el usuario.

Este tipo de errores puede permitir a usuarios malintencionados acceder a datos a los que de otro modo no tendrían acceso y, en el peor de los casos, modificar el comportamiento de nuestras aplicaciones.

Este ejemplo esta basado en el post de Cesar Manivesa.

Supongamos que tenemos una consulta de la siguiente forma:

VB.NET:
  1. Dim sql As String = "Select estatus From usuarios Where " & _
  2.  " usuario = '" & Trim(Me.txtUser.Text) & _
  3.  "' And password = '" & Trim(Me.txtPassword.Text) & "'"

El formulario se mostraría de la siguiente forma:

login-net-6.JPG

Ingresando nuestros datos de forma normal nuestra instrucción seria así:

Select estatus From usuarios Where usuario = 'kike' And password = 'prueba'

Pero ingresando en la caja de texto password este código: prueba' or usuario<>'1, la instrucción quedaría así:

Select estatus From usuarios Where usuario = 'kike' And password = 'prueba' or usuario<>'1'

Obviamente al ser ejecutada nos devuelve registros y obtendríamos acceso al programa.

Y ahora lo más importante, ¿qué podemos hacer para evitar estos errores?
Pues hay varios sistemas para evitarlo. Por ejemplo podemos filtrar las entradas de los usuarios reemplazando la aparición de '(comillas simples) por otro carácter e incluso evitando que los usuarios puedan pasar caracteres como \ / “ ‘ o cualquier otro que se nos ocurra que puede causar problemas. Estos filtros pueden ser tan sencillos como utilizar la sentencia Replace de Visual Basic:

VB.NET:
  1. Dim sql As String = "Select estatus From usuarios Where " & _
  2.  " usuario = '" & Trim(Replace(Me.txtUser.Text, "'", "k")) & _
  3.  "' And password  = '" & Trim(Replace(Me.txtPassword.Text, "'", "k")) & "'"

Entonces nuestra sentencia alterada quedaría así:

Select estatus From usuarios Where usuario = 'kike' And password = 'pruebak or usuario<>k1'

 

Categories: Bases de Datos Tags: