Archivo

Archive for septiembre 2012

Base de datos de ejemplo Pedidos

30 de septiembre de 2012 1 comentario

Base de datos de ejemplo Pedidos

Categorías: Metodología

Cómo subir una web a un hosting gratuito

30 de septiembre de 2012 1 comentario

Consulta el siguiente fichero PDF para subir sitio a 000webhost.com

subir_web_hosting_gratuito

Categorías: Redes

Lenguajes de lado servidor

23 de septiembre de 2012 Deja un comentario

Presentación de los diferentes lenguajes de lado servidor empleados para el diseño de webs dinámicas

Existe una multitud de lenguajes concebidos o no para Internet. Cada uno de ellos explota más a fondo ciertas características que lo hacen más o menos útiles para desarrollar distintas aplicaciones.

La versatilidad de un lenguaje está íntimamente relacionada con su complejidad. Un lenguaje complicado en su aprendizaje permite en general el realizar un espectro de tareas más amplio y más profundamente. Es por ello que a la hora de elegir el lenguaje que queremos utilizar tenemos que saber claramente qué es lo que queremos hacer y si el lenguaje en cuestión nos lo permite o no.

En el dominio de la red, los lenguajes de lado servidor más ampliamente utilizados para el desarrollo de páginas dinámicas son el ASP, PHP y PERL.

El ASP (Active Server Pages) es un lenguaje derivado del Visual Basic desarrollado por Microsoft. Evidentemente su empleo se realiza sobre plataformas funcionando bajo sistema Windows NT.

El PHP podría ser considerado como el lenguaje análogo al ASP utilizado en plataformas Unix y Linux.

Estos dos lenguajes resultan bastante útiles para la explotación de bases de datos y su aprendizaje resulta accesible para una persona profana de la programación. Cualquiera de ellos resultaría la opción ideal a la hora de hacer evolucionar un sitio web realizado en HTML.

Por otra parte, el PERL es un lenguaje más rápido y potente que requiere obviamente un aprendizaje más largo y resulta más reservado para personas ya familiarizadas con la verdadera programación.

Lenguajes de lado servidor o cliente

23 de septiembre de 2012 Deja un comentario

Explicación de qué diferencia hay entre lenguajes como Java o JavaScript y otros como ASP o PHP. Pros y contras de cada tipo.

El navegador es una especie de aplicación capaz de interpretar las órdenes recibidas en forma de código HTML undamentalmente y convertirlas en las páginas que son el resultado de dicha orden.

Cuando nosotros pinchamos sobre un enlace hipertexto, en realidad lo que pasa es que establecemos una petición de un archivo HTML residente en el servidor (un ordenador que se encuentra continuamente conectado a la red) el cual es enviado e interpretado por nuestro navegador (el cliente).

Sin embargo,  si la página que pedimos no es un archivo HTML, el navegador es incapaz de interpretarla y lo único que es capaz de hacer es salvarla en forma de archivo. Es por ello que, si queremos emplear lenguajes accesorios para realizar un sitio web, es absolutamente necesario que sea el propio servidor quien los ejecute e interprete para luego enviarlos al cliente (navegador) en forma de archivo HTML totalmente legible por él.

De modo que, cuando pinchamos sobre un enlace a una pagina que contiene un script en un lenguaje comprensible unicamente por el servidor, lo que ocurre en realidad es que dicho script es ejecutado por el servidor y el resultado de esa ejecucion da lugar a la generacion de un archivo HTML que es enviado al cliente.

Así pues, podemos hablar de lenguajes de lado servidor que son aquellos lenguajes que son reconocidos, ejecutados e interpretados por el propio servidor y que se envían al cliente en un formato comprensible para él. Por otro lado, los lenguajes de lado cliente (entre los cuales no sólo se encuentra el HTML sino también el Java y el JavaScript los cuales son simplemente incluidos en el código HTML) son aquellos que pueden ser directamente «digeridos» por el navegador y no necesitan un
pretratamiento.

Cada uno de estos tipos tiene por supuesto sus ventajas y sus inconvenientes. Así, por ejemplo, un lenguaje de lado cliente es
totalmente independiente del servidor, lo cual permite que la página pueda ser albergada en cualquier sitio sin necesidad de pagar más ya que, por regla general, los servidores que aceptan páginas con scripts de lado servidor son en su mayoría de pago o sus prestaciones son muy limitadas. Inversamente, un lenguaje de lado servidor es independiente del cliente por lo que es mucho menos rígido respecto al cambio de un navegador a otro o respecto a las versiones del mismo. Por otra parte, los scripts son almacenados en el servidor quien los ejecuta y traduce a HTML por lo que permanecen ocultos para el cliente. Este hecho puede
resultar a todas luces una forma legítima de proteger el trabajo intelectual realizado.

Páginas dinámicas vs HTML

23 de septiembre de 2012 Deja un comentario

Si el sitio es extenso y sus contenidos cambian rápidamente, nos interesa el automatizar en la medida de lo posible todas las tareas de tal forma que podamos gestionar su explotación de la manera más óptima.

Para dejar más claro hasta que punto resulta útil utilizar páginas dinámicas lo mejor será ejemplificarlo a partir de un sitio web modelo.

Supongamos que hemos decidido realizar un portal de televisión donde una de las informaciones principales a proveer podría ser la programación semanal. Efectivamente, esta información suele ser dada por las televisiones con meses de antelación y podría ser muy fácilmente almacenada en una base de datos. Si trabajásemos con páginas HTML, tendríamos que construir una página independiente para cada semana en la cual introduciríamos «a mano» cada uno de los programas de cada una de las cadenas. Asimismo, cada semana nos tendríamos que acordar de descolgar la página de la semana pasada y colgar la de la anterior. Todo esto podría ser fácilmente resuelto mediante páginas dinámicas. En este caso, lo que haríamos sería crear un programa (solo uno) que se encargaría de recoger de la base de datos de la programación aquellos programas que son retransmitidos en las fechas que nos interesan y de confeccionar una página donde aparecerían ordenados por cadena y por hora de retransmisión. De este modo, podemos automatizar un proceso y desentendernos de un aspecto de la página por unos meses.

Este hecho lo podríamos aplicar a otras situaciones: podemos preparar el horóscopo de todos los días, las promociones de un sitio de e-comercio…

Además, tampoco resultaría complicado el introducir una pequeña caja de búsqueda que nos permitiera dar rápidamente con el programa que queremos ver, saber a qué hora y en qué cadena se emite.

Volviendo a nuestro portal de televisión, en él hay una sección en la cual presentamos todas las series actualmente emitidas con comentarios sobre ella, fotos, etc. Podríamos, en lugar de hacer una página HTML por serie, hacer una única página dinámica en contacto con una base de datos en la cual visualizamos las fotos y comentarios relativos a la serie que nos interesa. Asimismo, si lo que buscamos es modificar el formato del texto de dicha sección, podemos automatizar este proceso sin necesidad de cambiar a mano cada una de las etiquetas font y sin hacer uso de la hojas de estilo las cuales no son reconocidas por la totalidad de los navegadores.

Otra serie de aspectos tales como la gestión de las lenguas, podrían ser fácilmente resueltos sin para ello duplicar el número de páginas y buscar los textos a traducir penosamente entre el código HTML.

En realidad, a partir de estas herramientas, podemos plantearnos cuantas cosas queramos.

Categorías: Metodología Etiquetas: , ,

Concepto de páginas dinámicas

23 de septiembre de 2012 Deja un comentario

En realidad el HTML no es  lenguaje de programación sino, más bien, se trata de un lenguaje descriptivo que tiene como objeto dar formato al texto y las imágenes que pretendemos visualizar en el navegador.

A partir de este lenguaje somos capaces de introducir enlaces, seleccionar el tamaño de las fonts o intercalar imágenes, todo esto de una manera prefijada y en ningún caso inteligente. En efecto, el HTML no permite el realizar un simple cálculo matemático o crear una página de la nada a partir de una base de datos. A decir verdad, el HTML, aunque muy útil a pequeña escala, resulta bastante limitado a la hora de concebir grandes sitios o portales.

Es esta deficiencia del HTML la que ha hecho necesario el empleo de otros lenguajes accesorios mucho más versátiles y de un aprendizaje relativamente más complicado, capaces de responder de manera inteligente a las demandas del navegador y que permiten la automatización de determinadas tareas tediosas e irremediables como pueden ser las actualizaciones, el tratamiento de pedidos de una tienda virtual…

Estos lenguajes capaces de recrear a partir de ciertos «scripts» un sinfín de páginas automatizadas son los protagonistas de este concepto de páginas dinámicas.

Categorías: Desarrollo web Etiquetas: , ,

Ejercicio: Piezas y Proveedores

23 de septiembre de 2012 Deja un comentario

  1. Crea la base de datos Suministros
  2. Crea las 3 tablas anteriores
  3. Inserta al menos 5 piezas y 5 proveedores (uno de ellos debe tener código HAL). También inserta en la tabla Suministra al menos 10 filas.
  4. Realiza consultas select para obtener:
    1. Nombres de todos los artículos
    2. Todos los datos de los proveedores
    3. Precio medio de todas las piezas
    4. Nombre de los proveedores que suministran la pieza 1.
    5. Nombres de piezas suministradas por proveedor cuyo código es HAL
    6. Nombre del proveedor que suministra la pieza más cara
    7. Aumentar los precios en una unidad
    8. Hacer constar que la empresa «Tornillos SL» (con código TOSL) va a comenzar a suministrarnos tornillos a 7 pesetas.
    9. Nombre de las piezas que suministra «Tornillos SL»
    10. Nombre del proveedor y número de piezas que suministra.
    11. Nombre de las piezas cuyo precio medio sea mayor a 10 euros y menor de 20.
    12. Diferencia entre el producto más caro y el más barato.
    13. Ordena los proveedores por nombre ascendentemente y muestra sólo los 3 primeros.
    14. Nombre de los proveedores que empiezan por A (si no tienes ninguno que empiece por A, utiliza otra letra para hacer la prueba).

..

CREATE TABLE SUMINISTRA(
codigopieza integer,
idproveedor varchar(4),
precio integer,
primary key (codigopieza,idproveedor),
key(codigopieza),
foreign key (codigopieza) references piezas(codigo) 
on delete cascade on update cascade,
key(idproveedor),
foreign key (idproveedor) references proveedores(id) 
on delete cascade on update cascade);


CONSULTAS:
SELECT * FROM PROVEEDORES;
SELECT AVG(PRECIO) FROM SUMINISTRA;
SELECT NOMBRE FROM PROVEEDORES, SUMINISTRA WHERE CODIGOPIEZA=1 AND
ID=IDPROVEEDOR;
SELECT NOMBRE FROM PIEZAS, SUMINISTRA WHERE IDPROVEEDOR='HAL' AND
CODIGOPIEZA=CODIGO;

SELECT NOMBRE FROM PROVEEDORES, SUMINISTRA WHERE IDPROVEEDOR=ID AND
PRECIO=(SELECT MAX(PRECIO) FROM SUMINISTRA);

UPDATE SUMINISTRA SET PRECIO=PRECIO+1;
INSERT INTO PROVEEDORES(ID,NOMBRE) VALUES ('TOSL', 'Tornillos SL');
INSERT INTO PIEZAS(CODIGO, NOMBRE) VALUES (17, 'Tornillo');
INSERT INTO SUMINISTRA VALUES (17, 'TOSL', 7);

SELECT PIEZAS.NOMBRE FROM PIEZAS, SUMINISTRA, PROVEEDORES
WHERE PROVEEDORES.NOMBRE='Tornillos SL' AND ID=IDPROVEEDOR AND
CODIGOPIEZA=CODIGO;

SELECT PROVEEDORES.NOMBRE, COUNT(*)
FROM PROVEEDORES, SUMINISTRA
WHERE IDPROVEEDOR=ID
GROUP BY IDPROVEEDOR;

SELECT NOMBRE
FROM PIEZAS, SUMINISTRA
WHERE CODIGO=CODIGOPIEZA
GROUP BY CODIGOPIEZA
HAVING AVG(PRECIO)>10 AND AVG(PRECIO)<20;

SELECT MAX(PRECIO) - MIN(PRECIO) AS DIFERENCIA
FROM SUMINISTRA;

SELECT NOMBRE
FROM PROVEEDORES
ORDER BY NOMBRE ASC
LIMIT 3

SELECT NOMBRE
FROM PROVEEDORES
WHERE NOMBRE LIKE 'A%';

Ejercicio: La tienda de Informática

23 de septiembre de 2012 Deja un comentario

  1. Crea la Base de datos «Tiendainformatica»
  2. Crea las dos tablas, fabricantes y artículos
  3. Inserta al menos 4 fabricantes y 10 artículos
  4. Realiza las siguientes consultas:
    1. Obtener los nombres de los productos de la tienda
    2. Obtener los nombres y los precios de los productos de la tienda
    3. Obtener el nombre de los productos cuyo precio sea menor o igual a 200 euros.
    4. Obtener todos los datos de los artículos cuyo precio esté entre 60 y 140 euros, ambos precios incluidos
    5. Obtener el nombre y el precio en pesetas (es decir, multiplicado por 166,386)
    6. Obtener el precio medio de todos los productos
    7. Precio medio de los artículos cuyo fabricante sea 2
    8. Número de artículos cuyo precio sea superior a 180 euros.
    9. Nombre y precio de los productos cuyo precio sea mayor o igual a 180 euros, ordenándolos descendentemente por precio y ascendentemente por nombre.
    10. Obtener un listado completo de artículos, incluyendo los datos del fabricante también
    11. Obtener un listado de artículos, incluyendo el nombre, precio y nombre de fabricante
    12. Obtener el precio medio de los productos de cada fabricante, mostrando solo los códigos de cada fabricante
    13. Hallar el precio medio de los productos de cada fabricante, mostrando el nombre del fabricante.
    14. Nombre de los fabricantes que ofrezcan productos cuyo precio medio sea superior a 150 euros
    15. Nombre y precio del artículo más barato.
    16. Añadir un nuevo producto: Altavoces de 70 euros del fabricante 2.
    17. Cambiar el nombre del producto 8 a Impresora Láser
    18. Aplicar un descuento del 10% a todos los productos
    19. Aplicar un descuento de 10 euros a todos los productos cuyo precio sea superior a 120 euros.

…. ALGUNAS CONSULTAS RESUELTAS:

SELECT *
FROM ARTICULOS
WHERE PRECIO BETWEEN 60 AND 140;

SELECT *
FROM ARTICULOS
WHERE PRECIO>=60 AND PRECIO<=140;

SELECT NOMBRE, PRECIO*166.386 AS PRECIOENPESETAS
FROM ARTICULOS;

SELECT AVG(PRECIO) FROM ARTICULOS;

SELECT AVG(PRECIO) FROM ARTICULOS WHERE FABRICANTE=2;

SELECT COUNT(CODIGO) FROM ARTICULOS WHERE PRECIO>180;

SELECT NOMBRE, PRECIO FROM ARTICULOS WHERE PRECIO>=180;

SELECT NOMBRE, PRECIO FROM ARTICULOS WHERE PRECIO>=180 
ORDER BY PRECIO DESC, NOMBRE ASC;

SELECT * FROM ARTICULOS, FABRICANTES 
WHERE ARTICULOS.FABRICANTE=FABRICANTES.CODIGO;

SELECT ARTICULOS.NOMBRE, PRECIO, FABRICANTES.NOMBRE
FROM ARTICULOS, FABRICANTES
WHERE ARTICULOS.FABRICANTE=FABRICANTES.CODIGO;

SELECT FABRICANTE, AVG(PRECIO)
FROM ARTICULOS
GROUP BY FABRICANTE;

SELECT FABRICANTES.NOMBRE, AVG(PRECIO)
FROM ARTICULOS, FABRICANTES
WHERE ARTICULOS.FABRICANTE=FABRICANTES.CODIGO
GROUP BY FABRICANTES.CODIGO;

SELECT FABRICANTES.NOMBRE
FROM FABRICANTES, ARTICULOS
WHERE FABRICANTES.CODIGO=ARTICULOS.FABRICANTE
GROUP BY FABRICANTES.CODIGO;
HAVING AVG(PRECIO)>150;


SELECT AVG(PRECIO), CIUDADES.NOMBRE
FROM ARTICULOS, CIUDADES, FABRICANTES
WHERE ARTICULOS.FABRICANTE=FABRICANTES.CODIGO AND
      FABRICANTES.CIUDAD=CIUDADES.CODIGO;

SELECT NOMBRE, PRECIO
FROM ARTICULOS
WHERE PRECIO = (SELECT MIN(PRECIO) FROM ARTICULOS);

UPDATE ARTICULOS SET NOMBRE='Impresora Láser' WHERE CODIGO=8;

UPDATE ARTICULOS SET PRECIO=PRECIO-(PRECIO*0.1);

UPDATE ARTICULOS SET PRECIO=PRECIO-10 WHERE PRECIO>120;



Categorías: Metodología Etiquetas: , , ,

Importar y exportar datos

23 de septiembre de 2012 Deja un comentario

MySQL permite copiar tablas en diferentes formatos de texto, así como importar   datos a partir de fichero de texto en diferentes formatos.

Esto se puede usar para exportar los datos de nuestras bases de datos a otras aplicaciones,   o bien para importar datos desde otras fuentes a nuestras tablas. También se puede usar   para hacer copias de seguridad y restaurarlas posteriormente.

Exportar a otros ficheros

Para extraer datos desde una base de datos a un fichero se usa la sentencia   SELECT … INTO OUTFILE.

El resto de las cláusulas de SELECT siguen siendo aplicables, la única diferencia   es que la salida de la selección se envía a un fichero en lugar de hacerlo a la consola.

La sintaxis de la parte INTO OUTFILE es:

[INTO OUTFILE 'file_name' export_options]

file_name es el nombre del fichero de salida. Ese fichero no debe existir, ya que en caso   contrario la sentencia fallará.

En cuanto a las opciones de exportación son las mismas que para las cláusulas FIELDS y   LINES de LOAD DATA. Su sintaxis es:

    [FIELDS
        [TERMINATED BY '\t']
        [[OPTIONALLY] ENCLOSED BY '']
        [ESCAPED BY '\\' ]
    ]
    [LINES 
        [STARTING BY '']    
        [TERMINATED BY '\n']
    ]

Estas cláusulas nos permiten crear diferentes formatos de ficheros de salida.

La cláusula FIELDS se refiere a las opciones de cada columna:

  • TERMINATED BY ‘carácter’: nos permite elegir el carácter delimitador que se usará     para separar cada columna. Por defecto, el valor que se usa es el tabulador, pero podemos     usar ‘;’, ‘,’, etc.
  • [OPTIONALLY] ENCLOSED BY ‘carácter’: sirve para elegir el carácter usado para     entrecomillar cada columna. Por defecto no se entrecomilla ninguna columna, pero podemos     elegir cualquier carácter. Si se añade la palabra OPTIONALLY sólo se entrecomillarán     las columnas de texto y fecha.
  • ESCAPED BY ‘carácter’: sirve para indicar el carácter que se usará para escapar     aquellos caracteres que pueden dificultar la lectura posterior del fichero. Por ejemplo, si     terminamos las columnas con ‘,’ y no las entrecomillamos, un carácter ‘,’ dentro de una     columna de texto se interpretará como un separador de columnas. Para evitar esto se puede     escapar esa coma con otro carácter. Por defecto se usa el carácter ‘\’.

La cláusula LINES se refiere a las opciones para cada fila:

  • STARTING BY ‘carácter’: permite seleccionar el carácter para comenzar cada línea.     Por defecto no se usa ningún carácter para ello.
  • TERMINATED BY ‘carácter’: permite elegir el carácter para terminar cada línea. Por     defecto es el retorno de línea, pero se puede usar cualquier otro carácter o caracteres,     por ejemplo ‘\r\n’.

Por ejemplo, para obtener un fichero de texto a partir de la tabla ‘gente’, con las columnas   delimitadas por ‘;’, entrecomillando las columnas de texto con ‘»‘ y separando cada fila por   la secuencia ‘\r\n’, usaremos la siguiente sentecia:

mysql> SELECT * FROM gente
    -> INTO OUTFILE "gente.txt" 
    -> FIELDS TERMINATED BY ';' 
    -> OPTIONALLY ENCLOSED BY '\"' 
    -> LINES TERMINATED BY '\n\r';
Query OK, 5 rows affected (0.00 sec)

mysql>

El fichero de salida tendrá este aspecto:

"Fulano";"1974-04-12"
"Mengano";"1978-06-15"
"Tulano";"2000-12-02"
"Pegano";"1993-02-10"
"Mengano";\N

La fecha para «Mengano» era NULL, para indicarlo se muestra el valor \N.

Importar a partir de ficheros externos

Por supuesto, el proceso contrario también es posible. Podemos leer el contenido de un fichero   de texto en una tabla. El fichero origen puede haber sido creado mediante una sentecia   SELECT … INTO OUTFILE, o mediante cualquier otro medio.

Para hacerlo disponemos de la sentencia LOAD DATA, cuya sintaxis más simple es:

LOAD DATA [LOCAL] INFILE 'file_name.txt'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY '\t']
        [[OPTIONALLY] ENCLOSED BY '']
        [ESCAPED BY '\\' ]
    ]
    [LINES 
        [STARTING BY '']    
        [TERMINATED BY '\n']
    ]
    [IGNORE number LINES]
    [(col_name,...)]

La cláusula LOCAL indica, si aparece, que el fichero está en el ordenador del cliente.   Si no se especifica el fichero de texto se buscará en el servidor, concretamente en el mismo   directorio donde esté la base de datos. Esto nos permite importar datos desde nuestro ordenador   en un sistema en que el servidor de MySQL se encuentra en otra máquina.

Las cláusulas REPLACE e IGNORE afectan al modo en que se tratan las filas leídas   que contengan el mismo valor para una clave principal o única para una fila existente en la   tabla. Si se especifica REPLACE se sustituirá la fila actual por la leída. Si se   especifica IGNORE el valor leído será ignorado.

La parte INTO TABLA tbl_name indica en qué tabla se insertarán los valores leídos.

No comentaremos mucho sobre las cláusulas FIELDS y LINES ya que su significado es   el mismo que vimos para la sentencia SELECT … INTO OUTFILE. Estas sentencias nos   permiten interpretar correctamente cada fila y cada columna, adaptándonos al formato del   fichero de texto de entrada.

La misma utilidad tiene la cláusula IGNORE número LINES, que nos permite que las primeras   número líneas no se interpreten como datos a importar. Es frecuente que los ficheros de   texto que usaremos como fuente de datos contengan algunas cabeceras que expliquen el contenido   del fichero, o que contengan los nombres de cada columna. Usando esta cláusula podemos ignorarlas.

La última parte nos permite indicar la columna a la que será asignada cada una de las columnas   leídas, esto será útil si el orden de las columnas en la tabla no es el mismo que en el fichero   de texto, o si el número de columnas es diferente en ambos.

Por ejemplo, supongamos que queremos añadir el contenido de este fichero a la tabla «gente»:

Fichero de datos de "gente"
fecha,nombre
2004-03-15,Xulana
2000-09-09,Con Clase
1998-04-15,Pingrana

Como vemos, hay dos filas al principio que no contienen datos válidos, las columnas están separadas   con comas y, como hemos editado el fichero con el «notepad», las líneas terminan con «\n\r». La   sentencia adecuada para leer los datos es:

mysql> LOAD DATA INFILE "gente.txt"
    -> INTO TABLE gente
    -> FIELDS TERMINATED BY ','
    -> LINES TERMINATED BY '\r\n'
    -> IGNORE 2 LINES
    -> (fecha,nombre);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql>

El nuevo contenido de la tabla es:

mysql> SELECT * FROM gente;
+-----------+------------+
| nombre    | fecha      |
+-----------+------------+
| Fulano    | 1974-04-12 |
| Mengano   | 1978-06-15 |
| Tulano    | 2000-12-02 |
| Pegano    | 1993-02-10 |
| Mengano   | NULL       |
| Xulana    | 2004-03-15 |
| Con Clase | 2000-09-09 |
| Pingrana  | 1998-04-15 |
+-----------+------------+
8 rows in set (0.00 sec)

mysql>

Usuarios / Privilegios

23 de septiembre de 2012 Deja un comentario

Hasta ahora hemos usado sólo el usuario ‘root’, que es el administrador, y que dispone   de todos los privilegios disponibles en MySQL.

Sin embargo, normalmente no será una buena práctica dejar que todos los usuario con   acceso al servidor tengan todos los privilegios. Para conservar la integridad de los   datos y de las estructuras será conveniente que sólo algunos usuarios puedan realizar   determinadas tareas, y que otras, que requieren mayor conocimiento sobre las estructuras   de bases de datos y tablas, sólo puedan realizarse por un número limitado y controlado   de usuarios.

Los conceptos de usuarios y privilegios están íntimamente relacionados. No se pueden   crear usuarios sin asignarle al mismo tiempo privilegios. De hecho, la necesidad de crear   usuarios está ligada a la necesidad de limitar las acciones que tales usuarios pueden   llevar a cabo.

MySQL permite definir diferentes usuarios, y además, asignar a cada uno determinados   privilegios en distintos niveles o categorías de ellos.

Niveles de privilegios

En MySQL existen cinco niveles distintos de privilegios:

Globales: se aplican al conjunto de todas las bases de datos en un servidor. Es el   nivel más alto de privilegio, en el sentido de que su ámbito es el más general.

De base de datos: se refieren a bases de datos individuales, y por extensión,   a todos los objetos que contiene cada base de datos.

De tabla: se aplican a tablas individuales, y por lo tanto, a todas las columnas de   esas tabla.

De columna: se aplican a una columna en una tabla concreta.

De rutina: se aplican a los procedimientos almacenados. Aún no hemos visto nada   sobre este tema, pero en MySQL se pueden almacenar procedimietos consistentes en   varias consultas SQL.

Crear usuarios

Aunque en la versión 5.0.2 de MySQL existe una sentencia para crear usuarios,   CREATE USER, en versiones anteriores se usa exclusivamente la sentencia   GRANT para crearlos.

En general es preferible usar GRANT, ya que si se crea un usuario mediante   CREATE USER, posteriormente hay que usar una sentencia GRANT para   concederle privilegios.

Usando GRANT podemos crear un usuario y al mismo tiempo concederle también los   privilegios que tendrá. La sintaxis simplificada que usaremos para GRANT, sin   preocuparnos de temas de cifrados seguros que dejaremos ese tema para capítulos avanzados,   es:

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON 
    TO user [IDENTIFIED BY [PASSWORD] 'password']
        [, user [IDENTIFIED BY [PASSWORD] 'password']] ...

La primera parte priv_type [(column_list)] permite definir el tipo de   privilegio concedido para determinadas columnas. La segunda ON {tbl_name | * | *.*   | db_name.*}, permite conceder privilegios en niveles globales, de base de datos   o de tablas.

Para crear un usuario sin privilegios usaremos la sentencia:

mysql> GRANT USAGE ON *.* TO anonimo IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.02 sec)

Hay que tener en cuenta que la constraseña se debe introducir entre comillas de forma   obligatoria.

Un usuario ‘anonimo’ podrá abrir una sesión MySQL mediante una orden:

C:\mysql -h localhost -u anonimo -p

Pero no podrá hacer mucho más, ya que no tiene privilegios. No tendrá, por ejemplo, oportunidad   de hacer selecciones de datos, de crear bases de datos o tablas, insertar datos, etc.

Conceder privilegios

Para que un usuario pueda hacer algo más que consultar algunas variables del sistema   debe tener algún privilegio. Lo más simple es conceder el privilegio para seleccionar datos   de una tabla concreta. Esto se haría así:

La misma sentencia GRANT se usa para añadir privilegios a un usuario existente.

mysql> GRANT SELECT ON prueba.gente TO anonimo;
Query OK, 0 rows affected (0.02 sec)

Esta sentencia concede al usuario ‘anonimo’ el privilegio de ejecutar sentencias   SELECT sobre la tabla ‘gente’ de la base de datos ‘prueba’.

Un usuario que abra una sesión y se identifique como ‘anonimo’ podrá ejecutar estas   sentencias:

mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| prueba   |
+----------+
1 row in set (0.01 sec)

mysql> USE prueba;
Database changed
mysql> SHOW TABLES;
+------------------+
| Tables_in_prueba |
+------------------+
| gente            |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM gente;
+----------+------------+
| nombre   | fecha      |
+----------+------------+
| Fulano   | 1985-04-12 |
| Mengano  | 1978-06-15 |
| Tulano   | 2001-12-02 |
| Pegano   | 1993-02-10 |
| Pimplano | 1978-06-15 |
| Frutano  | 1985-04-12 |
+----------+------------+
6 rows in set (0.05 sec)

mysql>

Como se ve, para este usuario sólo existe la base de datos ‘prueba’ y dentro de   esta, la tabla ‘gente’. Además, podrá hacer consultas sobre esa tabla, pero no podrá   añadir ni modificar datos, ni por supuesto, crear o destruir tablas ni bases de datos.

Para conceder privilegios globales se usa ON *.*, para indicar que los privilegios   se conceden en todas las tablas de todas las bases de datos.

Para conceder privilegios en bases de datos se usa ON nombre_db.*, indicando que   los privilegios se conceden sobre todas las tablas de la base de datos ‘nombre_db’.

Usando ON nombre_db.nombre_tabla, concedemos privilegios de nivel de tabla para   la tabla y base de datos especificada.

En cuanto a los privilegios de columna, para concederlos se usa la sintaxis   tipo_privilegio (lista_de_columnas), [tipo_privilegio (lista_de_columnas)].

Otros privilegios que se pueden conceder son:

  • ALL: para conceder todos los privilegios.
  • CREATE: permite crear nuevas tablas.
  • DELETE: permite usar la sentencia DELETE.
  • DROP: permite borrar tablas.
  • INSERT: permite insertar datos en tablas.
  • UPDATE: permite usar la sentencia UPDATE.

Para ver una lista de todos los privilegios existentes consultar la sintaxis de la sentencia   GRANT.

Se pueden conceder varios privilegios en una única sentencia. Por ejemplo:

mysql> GRANT SELECT, UPDATE ON prueba.gente TO anonimo IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.22 sec)

mysql>

Un detalle importante es que para crear usuarios se debe tener el privilegio GRANT   OPTION, y que sólo se pueden conceder privilegios que se posean.

Revocar privilegios

Para revocar privilegios se usa la sentencia REVOKE.

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON 
    FROM user [, user] ...

La sintaxis es similar a la de GRANT, por ejemplo, para revocar el privilegio   SELECT de nuestro usuario ‘anonimo’, usaremos la sentencia:

mysql> REVOKE SELECT ON prueba.gente FROM anonimo;
Query OK, 0 rows affected (0.05 sec)

Mostrar los privilegios de un usuario

Podemos ver qué privilegios se han concedido a un usuario mediante la sentencia   SHOW GRANTS. La salida de esta sentencia es una lista de sentencias   GRANT que se deben ejecutar para conceder los privilegios que tiene el   usuario. Por ejemplo:

mysql> SHOW GRANTS FOR anonimo;
+--------------------------------------------------------------------+
| Grants for anonimo@%                                               |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'anonimo'@'%' IDENTIFIED BY PASSWORD '*5...' |
| GRANT SELECT ON `prueba`.`gente` TO 'anonimo'@'%'                  |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql>

Nombres de usuarios y contraseñas

Como podemos ver por la salida de la sentencia SHOW GRANTS, el nombre de   usuario no se limita a un nombre simple, sino que tiene dos partes. La primera consiste   en un nombre de usuario, en nuestro ejemplo ‘anonimo’. La segunda parte, que aparece   separada de la primera por el carácter ‘@’ es un nombre de máquina (host). Este nombre   puede ser bien el de una máquina, por ejemplo, ‘localhost’ para referirse al ordenador   local, o cualquier otro nombre, o bien una ip.

La parte de la máquina es opcional, y si como en nuestro caso, no se pone, el usuario   podrá conectarse desde cualquier máquina. La salida de SHOW GRANTS lo   indica usando el comodín ‘%’ para el nombre de la máquina.

Si creamos un usuario para una máquina o conjunto de máquinas determinado, ese usuario   no podrá conectar desde otras máquinas. Por ejemplo:

mysql> GRANT USAGE ON * TO anonimo@localhost IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.00 sec)

Un usuario que se identifique como ‘anonimo’ sólo podrá entrar desde el mismo ordenador   donde se está ejecutando el servidor.

En este otro ejemplo:

mysql> GRANT USAGE ON * TO anonimo@10.28.56.15 IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.00 sec)

El usuario ‘anonimo’ sólo puede conectarse desde un ordenador cuyo IP sea ‘10.28.56.15’.

Aunque asignar una constraseña es opcional, por motivos de seguridad es recomendable   asignar siempre una.

La contraseña se puede escribir entre comillas simples cuando se crea un usuario, o se   puede usar la salida de la función PASSWORD() de forma literal, para evitar   enviar la clave en texto legible.

Si al añadir privilegios se usa una clave diferente en la cláusula IDENTIFIED BY,   sencillamente se sustituye la contraseña por la nueva.

Borrar usuarios

Para eliminar usuarios se usa la sentencia DROP USER.

No se puede eliminar un usuario que tenga privilegios, por ejemplo:

mysql> DROP USER anonimo;
ERROR 1268 (HY000): Can't drop one or more of the requested users
mysql>

Para eliminar el usuario primero hay que revocar todos sus privilegios:

mysql> SHOW GRANTS FOR anonimo;
+--------------------------------------------------------------------+
| Grants for anonimo@%                                               |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'anonimo'@'%' IDENTIFIED BY PASSWORD '*5...' |
| GRANT SELECT ON `prueba`.`gente` TO 'anonimo'@'%'                  |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> REVOKE SELECT ON prueba.gente FROM anonimo;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP USER anonimo;
Query OK, 0 rows affected (0.00 sec)

mysql>
Categorías: Metodología Etiquetas: , , , , ,