Archivo de la categoría: Bases de datos

Update con Subselect en Mysql

Es posible que en algunas oportunidades necesitemos hacer una actualización a una tabla en donde la clave a utilizar en el where nos sea desconocida, y que sólo podamos obtenerla partiendo de una segunda clave en una segunda tabla.

El truco para ésto es utilizar subconsultas.

Lo más probable es que al pensar en esto, escriban un ejemplo como el siguiente:

UPDATE
  tabla1
SET
  campo = 'nuevo_valor'
WHERE
  campo_de_referencia = (
    SELECT
      tabla1.valor
    FROM
      tabla1,
      tabla2
    WHERE
      tabla1.campo = 'viejo_valor'
      AND
      tabla1.clave_primaria = tabla2.clave_foranea
      AND
      tabla2.campo_de_referencia = 'otro_valor'
  )
;

Lamentablemente, ésto no va a funcionar y van a obtener el siguiente error.

You can't specify target table 'tabla1' for update in FROM clause

Sigue leyendo

Restaurar un backup plano en PostgreSql

En los posts previos sobre temas referentes a backups en PostgreSql, vimos un caso en el cual, en lugar de realizar el backup generando un dump comprimido, lo hacíamos en formato plano (en particular, el post hablaba sobre hacer un backup de sólo algunas tablas de una base de datos).

Ahora bien, cómo ¿hacemos para volver a introducir esos datos?.

Simplemente basta con ejecutar este comando:

psql -U usuario -d basededatos -h host -f archivoplano.sql

Automáticamente se nos pedirá la contraseña

Password for user usuario:

Una vez ingresada, nuestros datos pasarán a insertarse en PostgreSql.

Cómo crear un trigger con un Definer específico en Mysql

Normalmente, cuando se trabaja en entornos de desarrollo locales, se suele dejar al usuario con mayor privilegio y con eso aguantamos hasta el momento de pasar a producción.

Es en ese pasaje cuando descubrimos que el usuario que tenemos asignado está totalmente restringido sólo a nuestra base de datos, y hay ciertas operaciones que pueden resultar imposibles de resolver.

Un escenario posible seria al intentar crear un trigger, obtengamos un error por falta de privilegios.

Si además de éste usuario, podemos acceder a uno con privilegios más elevados (el usuario root es el habitual), podríamos crear el trigger.

Esto tampoco nos va a servir, porque cuando el usuario sin privilegios quiere ejecutar el trigger, le será negada la operación ya que el propietario del trigger es quien lo creó (en este coloquial ejemplo, sería propiedad del usuario root).

Ahora bien, la forma de poder crear un trigger pero asignándole un propietario que no se corresponde con el usuario que esté ejecutando, seria la siguiente:

CREATE DEFINER = 'usuario'@'host' TRIGGER mi_trigger BEFORE INSERT ON mi_tabla
  FOR EACH ROW BEGIN
 
  /* El código que tengamos que usar */
 
END;

De ésta forma, al crearlo con el usuario con privilegios, vamos a poder ejecutar la sentencia de creación del trigger y éste va a estar disponible para el usuario restringido que le indiquemos.

(Más que post esto parece un post-it)

Backup de tablas específicas en PostgreSql

Ya vimos cómo se hacen los backups, como se los automatiza e incluso, cómo restaurar esos backups en PostgreSql.

Hace unos días tuve un requerimiento por el cual, si bien la base de datos en cuestión ya se backupea, me solicitaban hacer un backup con mayor periodicidad, pero sólo de un conjunto de tablas.

Bien, gracias a la flexibilidad de nuestro motor favorito, esto es muy sencillo.

Repasemos cómo hacíamos para hacer un dump completo de nuestro base de datos.

pg_dump -i -h localhost -p 5432 -U postgres -F c -b -v -f "/home/damian/backups/mibase.backup" mibase

Para exportar sólo un conjunto de tablas, tenemos que hacer un pequeño cambio.

pg_dump -i -h localhost -p 5432 -U postgres -t tabla -F p -b -v -f "/home/damian/backups/mitabla.sql" mibase

La diferencia entre ambos scripts radica en que agregamos el parámetro -t seguido del nombre de nuestra tabla (en este caso, con poca inspiración, usé tabla).

Lo que vamos a obtener es, solamente,  un backup de la tabla indicada, con su estructura y datos.

Si lo que necesitamos son un conjunto de tablas, tenemos dos formas de hacerlo.  La primera es usando el parámetro -t tantas veces como tablas vayamos a requerir.

pg_dump -i -h localhost -p 5432 -U postgres -t usuarios -t documentos -t logs -F p -b -v -f "/home/damian/backups/mistablas.sql" mibase

La segunda forma, es utilizar patrones (si es que se aplica a nuestro caso).

pg_dump -i -h localhost -p 5432 -U postgres -t productos_* -F p -b -v -f "/home/damian/backups/mistablas.sql" mibase

En ambos casos, se hará un backup de las tablas, vistas y/o secuencias que coincidan con lo indicado.

Sigue leyendo