Postgres BD Distribuidas
Postgres BD Distribuidas
Postgres BD Distribuidas
Dichas BDD tienen la capacidad de realizar procesamiento autónomo, esto permite realizar operaciones locales o distribuidas.
Un sistema de Bases de Datos Distribuida (SBDD) es un sistema en el cual múltiples sitios de bases de datos están ligados por un sistema de comunicaciones de tal forma
que, un usuario en cualquier sitio puede acceder los datos en cualquier parte de la red exactamente como si estos fueran accedidos de forma local.
Un sistema distribuido de bases de datos se almacenan en varias computadoras. Los principales factores que distinguen un SBDD de un sistema centralizado son los
siguientes:
www.v-espino.com/~chema/daw1/tutoriales/postgres/distribuidas.htm 1/6
5/5/2020 Postgres BD Distribuidas
www.datos.misiones.gov.ar
Desde cualquier BD se pueden recuperar datos de cualquier otra base de datos PostgresSQL (Naturalmente, es necesario identificarse con perfil de un usuario con acceso a
los mismos) usando dblink. DBLink son funciones preparadas por los autores de postgres que añaden la funcionalidad de acceso a datos de forma remota.
No se trata de conectarse remotamente con un servidor de bases de datos, sino acceder desde una base da datos a elementos de otra base de datos a través de una linea
de comunicaciones, combinando ambas
En la base de datos desde la que pretendemos conectarnos en remoto se ejecuta el SQL que creará las funciones de dblink. El script está en:
C:\Program Files\PostgreSQL\8.4\share\contrib\dblink.sql
Para las versiones 9.1 y posteriores, para generar las funciones de dblink basta ejecutar en SQL
dblink1
www.v-espino.com/~chema/daw1/tutoriales/postgres/distribuidas.htm 2/6
5/5/2020 Postgres BD Distribuidas
Los campos de las tablas del nodo remoto se “traen” al nodo local con el predicado FROM añadiendo los parámetros de conexión proporcionados por dblink
SELECT lista_de_campos
FROM dblink('dbname=baseDatos port=puerto host=ordenadorRemoto user=usuario password=contraseña','SQL') AS Alias(campo1 tipo1,campo2 tipo2,…)
WHERE condiciones
ORDER BY criterios_de_ordenacion;
Es necesario indicar en el Alias qué tipo de campos vienen desde el ordenador remoto, pues se desconoce. Este extremo se define en AS …
dblink2
En este caso se realiza mediante la ejecución de función dblink_exec(conexion,sentencia) Por ejemplo, si queremos insertar valores en la tabla gente (codigo int PK, nombre
varchar, sueldo double):
select dblink_exec('dbname=remota port=5432 host=yoquese.com user=postgres password=contrasena',
'INSERT INTO gente (codigo,nombre,sueldo) VALUES (33,\'Pepito\',1234.45));
Nota: \' sirve para incluir el carácter especial de comilla simple en la sentencia a ejecutar
Ejercicio 1.- Mostrar datos de otra base de datos residente en el mismo equipo:
SELECT p.nombre
FROM dblink('dbname=futbol user=postgres password=root','SELECT nombre FROM equipos') AS p(nombre varchar(100));
Ejercicio 2.- Mostrar los nombres de los empleados que comienzan por E en una tabla llamada templa de la base de datos empleado que
está en el servidor del alumno 'pepito' (IP=192.168.32.44):
SELECT p.nombre,p.apellido
FROM dblink('dbname=empleado
port=5432
host=192.168.32.44
user=postgres
password=root',
'SELECT nombre,apellido FROM templa')
AS p(nombre varchar(100),apellido varchar(100))
WHERE p.nombre LIKE 'E%';
Ejercicio 3.- Listado de apellidos y departamentos donde trabajan los empleados de la misma base de datos anterior. En este caso las 2
tablas son remotas.
SELECT a.b,d.f
FROM
dblink( 'dbname=ejemplo1 port=5432 host=192.168.32.44 user=postgres password=root' ,
'SELECT apellido,dept FROM templa') AS a(b varchar(100),c varchar(100)) ,
dblink( 'dbname=ejemplo1 port=5432 host=192.168.32.44 user=postgres password=root',
'SELECT numdep,nomdep FROM tdepta') AS d(e varchar(100),f varchar(100))
WHERE a.c=d.e;
Ejercicio 4.- Mezcla de datos remotos y locales. Esta vez se hará en varios pasos
SELECT r.nombre,a.texto
FROM dblink('SELECT nuempl,nombre FROM templa') AS r(nuempl varchar,nombre varchar),
tabla_local AS a
WHERE r.nuempl=a.codigo;
www.v-espino.com/~chema/daw1/tutoriales/postgres/distribuidas.htm 3/6
5/5/2020 Postgres BD Distribuidas
SELECT dblink_disconnect();
Ejercicio 5.- Realización de una copia de una tabla remota (o parte de ella)
SELECT dblink_connect('dbname=empleado port=5432 host=192.168.32.44 user=postgres password=root');
SELECT * into copia FROM dblink('SELECT nuempl,nombre FROM templa') AS r(nuempl varchar,nombre varchar);
SELECT dblink_disconnect();
quote
192.168.32.4 downjones
change
En cada ordenador del aula disponemos de una base de datos llamada 'mipasata' con una tabla llamada 'cartera' con nuestra cartera de valores como la siguiente
Realizar una función llamada cuanto() a la que se le pase un tic y un mercado y devuelva el valor correspondiente.
Ejemplo cuanto(‘BBVA’,’ibex35’) devolverá 5.555
Realizar una función llamada que() a la que se pasa un tic y un mercado y devuelve la moneda en la que se cotiza.
Ejemplo que(‘BBVA’,’ibex35’) devolverá ’E’
Realizar una función llamada cambio() a la que se le pasa dos codigos de monedas y devuelve el cambio correspondiente.
Ejemplo cambio(‘E’,‘D’) devolverá 1.3344
Con las funciones anteriores, realizar un listado del valor de nuestra cartera de valores
Solución.:
Todas las funciones reciben 2 parámetros llamados a y b
1.- Realizar una consulta sql que permita obtener las entradas disponibles y el precio de las mismas
select *
from
dblink('dbname=staples port=5432 host=lamerced.no-ip.org user=vendedor password=venta','select * from entradas_partido') AS e(fila integer,asiento integer,ocupado boolean),
dblink('dbname=staples port=5432 host=lamerced.no-ip.org user=vendedor password=venta','select * from precios_partido') AS p(fila integer,importe double precision)
where
e.fila=p.fila
and e.ocupado=false;
2.- Crear en nuestro servidor local una tabla llamada comisiones con los siguientes campos:
Tabla: comisiones
www.v-espino.com/~chema/daw1/tutoriales/postgres/distribuidas.htm 5/6
5/5/2020 Postgres BD Distribuidas
fila (entero): fila de la que sacamos la entrada
comision (double precision): comisión que nos llevamos por la venta
En esta tabla pondremos que la comisión por vender una entrada de la fila 1 es el 20% (0.2) y para la fila 2 nos llevamos el 10% (0.1)
3.- Realizar una función llamada vendiendo en nuestro servidor con las siguientes características:
declare
r boolean;
pr double precision;
sentencia character varying;
nada character varying;
begin
--Dependiendo de la instruccion anterior r puede ser false (disponible, true (ya vendida) o null (no existe esa entrada)
if(r=false) then
--Calculamos el importe de la entrada
select into pr p.importe*(1+c.comision)
from dblink('dbname=staples port=5432 host=lamerced.no-ip.org user=vendedor password=venta','select * from precios_partido') AS p(fila integer,importe double
precision),
comisiones c
where c.fila=f
and p.fila=f;
www.v-espino.com/~chema/daw1/tutoriales/postgres/distribuidas.htm 6/6