\set PROMPT1 '%n@%/=%# '
\c postgres postgres
/* 
Todos los roles que se crean heredan del grupo PUBLIC el permiso de conexión a cualquier
base de datos creada:
GRANT CONNECT ON DATABASE alquilerdcl TO role;
*/

create role organizador INHERIT createrole createdb LOGIN PASSWORD 'passorg';

/* Se conecta el role organizador a la base de datos actual (postgres) */
\c - organizador;
CREATE DATABASE alquilerdcl ENCODING utf8;

/* Se conecta el role organizador a la base de datos alquilerdcl */
\c alquilerdcl organizador;

/* Creación de esquemas */
CREATE SCHEMA gestion;
CREATE SCHEMA oferta;

/* Creación de roles */
CREATE ROLE productos NOINHERIT;
CREATE ROLE personas INHERIT;
CREATE ROLE isabel INHERIT LOGIN PASSWORD 'passisa';
CREATE ROLE ignacio INHERIT LOGIN PASSWORD 'passign';
CREATE ROLE diego NOINHERIT LOGIN PASSWORD 'passdie';
CREATE ROLE daniel NOINHERIT LOGIN PASSWORD 'passdan';

/* Concesión de permisos sobre los esquemas */
GRANT USAGE,CREATE ON SCHEMA oferta TO productos;
GRANT USAGE ON SCHEMA gestion TO productos;
GRANT USAGE,CREATE ON SCHEMA gestion TO personas;
GRANT USAGE ON SCHEMA oferta TO personas;

/* Asignar miembros a roles grupales */
GRANT productos TO diego,daniel;
GRANT personas TO isabel,ignacio;

/* Creación de los objetos de la base de datos por distintos roles */
\c - isabel

CREATE TABLE gestion.empleado(
id SERIAL PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
email VARCHAR(50) NOT NULL,
fechini DATE NOT NULL
);

/* Concesión del permiso para poder hacer referencia a la tabla empleado al role productos */
GRANT REFERENCES ON gestion.empleado TO productos;

\c - ignacio;

CREATE TABLE gestion.propietario(
id SERIAL PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
telefono CHAR(14) NOT NULL,
nacion VARCHAR(50) NOT NULL
);

GRANT REFERENCES ON gestion.propietario TO productos;

\c - diego;
/* El role diego no hereda los permisos de los grupos a los que pertenece. Debe de tomar la 
apariencia del role grupal productos para poder crear la tabla inmueble */

SET ROLE productos;

CREATE TABLE oferta.inmueble(
id SERIAL PRIMARY KEY,
direc TEXT NOT NULL,
cp CHAR(5) NOT NULL,
detalle TEXT NOT NULL,
propietario_id INT NOT NULL REFERENCES gestion.propietario(id),
empleado_id INT NOT NULL REFERENCES gestion.empleado(id)
);

/* 
No hace falta conceder el permiso para hacer referencia a la tabla inmueble al role productos, 
ya que este role es el propietario de las dos tablas: inmueble y dormitorio. Esta última tabla tiene que ser creada por el role daniel tomando la apariencia del role productos, ya que aquél tiene la propiedad NOINHERIT) 
*/

\c - daniel;

SET ROLE productos;

CREATE TABLE oferta.dormitorio(
inmueble_id INT NOT NULL REFERENCES oferta.inmueble(id),
num INT NOT NULL,
capacidad INT NOT NULL,
pvp DECIMAL(5,1) NOT NULL,
calidad VARCHAR(50) NOT NULL,
PRIMARY KEY(inmueble_id,num)
);


