PostgreSQL
Contents
PostgreSQL#

Funcionamiento de PostgreSQL
Índice
Primeros pasos#
Instalación de PostgreSQL#
Para instalar PostgreSQL desde cualquier sistema operativo es recomendable seguir los pasos de su web oficial: https://www.postgresql.org/download/
En Linux tendrás que descargar Pgadmin 4 desde su sitio web: https://www.pgadmin.org/download/
En un terminal podemos comprobar que se ha instalado ejecutando:
psql --version
Atención
Es posible que al instalar PGAdmin4 no este configurada la conexión, es crucial crear una contraseña para configurar la conexión desde la consola psql para el usuario postgres o sino no podremos configurar la conexión externa.
Conceptos básicos#
Cluster: Áreas de almacenamiento con una o más bases de datos.
Bases de datos: Colecciones de datos (igual que MySQL)
Esquemas: Colecciones de tablas en bases de datos.
Tablespaces: Almacenamiento en disco desde punto de vista entre tabla e índices.
Rol: Entidades que pueden ser dueñas de bases de datos o permisos (Usuarios y Grupos)
Tabla: Colecciones de datos relacionales.
Vista: Sentencias SQL que afectan a una o varias tablas.
Disparador (Trigger): Disparadores de eventos que se activan cuando se actua sobre alguna tabla.
Seguridad#
PostgreSQL cuenta con opciones para limitar el acceso a diferentes tipos de usuario en cada cluster, el tipo de ip permitida, el host si es local o externo, el método, y las direcciones permitidas.
Acceso a Postgres desde terminal#
En linux:
Abrir terminal y cambiar al usuario postgres:
sudo -i -u postgres
Con el usuario postgres ya se puede ejecutar en terminal:
psql
si queremos listar bases de datos:
\l
Para poder usar pgadmin debemos cambiar la contraseña del usuario postgres, en el cli psql ejecutamos la sentencia:
1ALTER USER postgres WITH ENCRYPTED password '1234';
Sentencias SQL Crear#
Crear base de datos#
1CREATE DATABASE coleccion
2 WITH
3 OWNER = postgres
4 ENCODING = 'UTF8'
5 CONNECTION LIMIT = -1
6 IS_TEMPLATE = False;
Nota
el campo CONNECTION LIMIT con -1 está indicando que tiene conexiones ilimitadas.
Crear Schema#
1CREATE SCHEMA coleccion;
Crear dominio#
los dominios se utilizan para establecer un diseño de entrada para un dato en particular. En este caso los campos id de la base de datos colección:
1CREATE DOMAIN coleccion.id AS CHAR(6) NOT NULL
2 CHECK(VALUE ~ '^[G]{1}[-]{1}\d{4}$'); -- Ejemplo: G-0001
Crear tabla#
Crear tabla sencilla:
1CREATE TABLE coleccion.consola (
2 id coleccion.id, -- el id le asignamos el dominio creado
3 marca VARCHAR(50) NOT NULL,
4 modelo VARCHAR(50) NOT NULL,
5 lanzamiento DATE,
6 PRIMARY KEY (id)
7);
Crear tabla con clave foranea:
1CREATE TABLE coleccion.videojuego (
2 id coleccion.id, -- el id le asignamos el dominio creado
3 titulo VARCHAR(50) NOT NULL,
4 id_sistema coleccion.id, -- y a la clave foranea también
5 lanzamiento DATE,
6 PRIMARY KEY (id),
7 FOREIGN KEY (id_sistema) REFERENCES coleccion.consola (id)
8 ON UPDATE CASCADE ON DELETE CASCADE -- actualizar datos en forma de cascada
9);
Sentencias SQL Alterar#
Alterar columnas#
1-- añadir columna:
2ALTER TABLE coleccion.videojuego ADD COLUMN formato VARCHAR(50);
3
4-- eliminar columna:
5ALTER TABLE coleccion.videojuego DROP COLUMN lanzamiento;
6
7-- cambiar formato de columna:
8ALTER TABLE coleccion.videojuego ALTER COLUMN formato TYPE CHAR(50);
9
10-- renombrar columna:
11ALTER TABLE coleccion.videojuego RENAME COLUMN formato TO soporte;
Alterar tablas#
1ALTER TABLE coleccion.videojuego RENAME TO juego;
Sentencia SQL Insertar#
Insertar registro#
1INSERT INTO coleccion.consola VALUES ('G-0001', 'Sony', 'Playstation', '1994-12-03');
Insertar varios registros#
1INSERT INTO coleccion.consola VALUES
2 ('G-0002', 'Sony', 'Playstation 2', '2000-03-04'),
3 ('G-0003', 'Sony', 'Playstation 3', '2006-11-11'),
4 ('G-0004', 'Sony', 'Playstation 4', '2013-11-15');
Insertar registro con clave foranea#
1 -- se agrega el id que corresponde al dato relacionado con la otra tabla.
2INSERT INTO coleccion.juego VALUES ('G-0001', 'Final Fantasy VIII','G-0001','1999-02-11');
Sentencias SQL Actualizar#
Actualizar columna completa#
1-- asi se actualizarán todos los datos de la columna lanzamiento:
2UPDATE coleccion.juego SET lanzamiento = '2022-10-10';
Actualizar columna de uno o varios registros por condición#
1UPDATE coleccion.juego SET titulo = 'Final Fantasy 8' WHERE id = 'G-0001';
Actualizar columna de uno o varios registros por varias condiciones#
1-- actualizar aquellos registros que cumplan dos o mas condiciones:
2UPDATE coleccion.consola SET lanzamiento = '1990-01-01' WHERE marca = 'Sony' AND modelo = 'Playstation 2';
3
4-- actualizar aquellos registros que cumplan al menos una de las siguientes condiciones:
5UPDATE coleccion.consola SET lanzamiento = '1990-01-01' WHERE marca = 'Sony' OR modelo = 'Playstation 2';
Sentencias SQL Eliminar#
Eliminar Schema#
1DROP SCHEMA public;
Eliminar Tabla#
1DROP TABLE coleccion.juego;
Eliminar columna completa#
1-- asi se Eliminarán todos los datos:
2DELETE FROM coleccion.juego;
Eliminar columna de uno o varios registros por condición#
1DELETE FROM coleccion.juego WHERE titulo = 'Final Fantasy 8';
Eliminar columna de uno o varios registros por varias condiciones#
1-- eliminar aquellos registros que cumplan dos o mas condiciones:
2DELETE FROM coleccion.consola WHERE lanzamiento = '1990-01-01' AND modelo = 'Playstation 2';
3
4-- eliminar aquellos registros que cumplan al menos una de las siguientes condiciones:
5DELETE FROM coleccion.consola WHERE marca = 'Sony' OR modelo = 'Playstation 2';
Condiciones SQL#
Las instrucciones SQL se utilizan para filtrar y organizar las consultas.
Instrucción WHERE#
1-- Seleccionar elementos añadiendo una condición where:
2SELECT * FROM coleccion.juego WHERE titulo='Final Fantasy VIII';
Instrucciones AND y OR#
1-- Con AND indicamos que se deben cumplir dos o mas campos para los resultados:
2SELECT * FROM coleccion.consola WHERE marca='Sony' AND modelo='Playstation';
3
4-- Con OR indicamos que se debe cumplir al menos uno de los siguientes campos:
5SELECT * FROM coleccion.consola WHERE marca='Sony' OR modelo='Playstation 2';
6
7-- Con IN indicamos que se recuperen varios registros que cumplan con una columna:
8SELECT * FROM coleccion.consola WHERE modelo IN ('Playstation', 'Playstation 2');
9
10-- Con NOT IN indicamos que se recuperen todos los registros que no cumplan con una columna:
11SELECT * FROM coleccion.consola WHERE modelo NOT IN ('Playstation', 'Playstation 2');
12
13-- Con LIKE indicamos que recupere aquellos valores que contengan parte de un registro:
14SELECT * FROM coleccion.consola WHERE modelo LIKE '%Playstation%';
15
16-- Con BETWEEN indicamos un rango de valores como fechas o registros inclusivos:
17SELECT * FROM coleccion.consola WHERE id BETWEEN 'G-0002' AND 'G-0003';
18
19-- Con <, <=, >, >= podemos buscar registros mayores o iguales a fechas o numeros:
20SELECT * FROM coleccion.consola WHERE id >= 'G-0002';
21
22-- Con <> podemos buscar registros distintos a un valor concreto al igual que NOT IN:
23SELECT * FROM coleccion.consola WHERE id <> 'G-0002';
Instrucción AS#
1-- AS define un alias para la columna:
2SELECT marca AS compañia, modelo AS consola FROM coleccion.consola;
Instrucción COUNT#
1-- Contar todos registros que hay en la tabla:
2SELECT COUNT(*) AS cantidad_consolas FROM coleccion.consola;
3
4-- Contar los resultados que cumplan una condición:
5SELECT COUNT(*) AS playstation_3 FROM coleccion.consola WHERE modelo = 'Playstation 3';
Instrucción SUM#
Primero vamos a crear una nueva columna con valores numéricos:
1-- Añadimos una columnas ventas:
2ALTER TABLE coleccion.consola ADD COLUMN ventas INTEGER;
3-- Poblamos la tabla:
4UPDATE coleccion.consola SET ventas = 1654654 WHERE id='G-0001';
5UPDATE coleccion.consola SET ventas = 1654655 WHERE id='G-0002';
6UPDATE coleccion.consola SET ventas = 1655522 WHERE id='G-0003';
7UPDATE coleccion.consola SET ventas = 16546355 WHERE id='G-0004';
Ahora hacemos la suma de toda la columna:
1-- sumar ventas totales:
2SELECT SUM(ventas) AS ventas_totales FROM coleccion.consola;
Nota
Si el valor numerico a sumar es de tipo varchar podemos cambiarlo a entero o decimal haciendo un CAST: SELECT SUM(CAST(ventas AS INT)) AS ventas_totales FROM coleccion.consola;
Instrucción MAX#
1-- sacar el valor máximo:
2SELECT MAX(ventas) FROM coleccion.consola;
Instrucción MIN#
1-- sacar el valor minimo:
2SELECT MIN(ventas) FROM coleccion.consola;
Instrucción AVG#
1-- sacar el promedio:
2SELECT AVG(ventas) AS promedio FROM coleccion.consola;
Instrucción ORDER BY#
1-- ordenar resultados de forma ascendente (ASC) o descendente (DESC):
2SELECT marca, modelo, ventas FROM coleccion.consola ORDER BY ventas DESC;
Instrucción HAVING#
1
Instrucción DISTINCT#
1-- DISTINCT muestra resultados no repetidos de una columna:
2SELECT DISTINCT marca FROM coleccion.consola;
Instrucción LIMIT#
1 la cantidad de resultados a mostrar:
2SELECT * FROM coleccion.consola LIMIT 2; -- con order by podemos ordenar los resultados y mostrar otros
Consultas relacionales#
Vamos a añadir unos registros:
1-- insertamos unos registros nuevos con claves foraneas (si no hay valores relacionados entre tablas no se mostrará nada)
2INSERT INTO coleccion.juego VALUES
3 ('G-0100', 'Final Fantasy VIII','G-0001','1999-02-11'),
4 ('G-0101', 'Final Fantasy IX','G-0001','1999-02-11'),
5 ('G-0102', 'Final Fantasy X','G-0002','1999-02-11');
Instrucción INNER JOIN#
1SELECT * FROM coleccion.juego
2INNER JOIN coleccion.consola -- seleccionamos la tabla a relacionar
3ON juego.id_sistema = consola.id; -- relacionamos la clave foranea de nuestra tabla con la clave primaria de la otra tabla
Nota
se pueden usar instrucciones condicionales como WHERE entre otras del anterior apartado.
Nota
también se pueden anidar sentencias INNER JOIN relacionando tablas con las ya presentes.
Instrucción LEFT JOIN#
TODO: REVISAR LEFT JOIN
1SELECT * FROM coleccion.juego
2LEFT JOIN coleccion.consola -- MOSTRARÁ los datos de la tabla join aunque tenga algun valor null
3ON juego.id_sistema = consola.id;
Instrucción RIGHT JOIN#
1SELECT * FROM coleccion.juego
2RIGHT JOIN coleccion.consola -- MOSTRARÁ los datos de la tabla seleccionada aunque no tenga relación con la tabla join
3ON juego.id_sistema = consola.id;
Vistas#
Las vistas sirven para mostrar datos de varias tablas en una especie de tabla virtual.
Crear vista:
1-- CREAR UNA VISTA:
2CREATE VIEW coleccion.juegos_psone AS
3SELECT * FROM coleccion.juego WHERE id_sistema = 'G-0001';
Utilizar vista:
1-- ejecutar consulta:
2SELECT * FROM coleccion.juegos_psone;
Borrar vista:
1-- eliminar vista:
2DROP VIEW coleccion.juegos_psone;
Renombrar vista:
1-- renombrar una vista:
2ALTER VIEW coleccion.juegos_psone RENAME TO psone_list;
Subconsultas#
1SELECT * FROM coleccion.juego
2WHERE id_sistema IN ( -- hacemos una segunda consulta utilizando el campo que coincide con la relación en este caso id_sistema = id:
3 SELECT id FROM coleccion.consola
4 WHERE id BETWEEN 'G-0002' AND 'G-0004'
5);
Funciones#
LEFT#
1-- Con left recuperamos de izquierda a derecha un numero de elementos:
2SELECT LEFT(modelo, 4) FROM coleccion.consola;
RIGHT#
1-- Con left recuperamos de derecha a izquierda un numero de elementos:
2SELECT RIGHT(modelo, 4) FROM coleccion.consola;
CONCAT#
1-- concat une mediante comas cadenas de texto:
2SELECT CONCAT(marca, ' ', modelo) FROM coleccion.consola;
LENGHT#
1-- cuenta los caracteres de celda:
2SELECT LENGTH(modelo) FROM coleccion.consola;
REPLACE#
1-- reemplaza caracteres recibiendo la columna, el o los caracteres a reemplazar y el valor nuevo:
2SELECT REPLACE(modelo, 'Playstation', 'ps') FROM coleccion.consola;
CAST#
1-- convierte un dato a otro tipo:
2SELECT CAST(CURRENT_TIME AS VARCHAR(50));
NOW#
1-- muestra la hora actual:
2SELECT NOW();
añadir un intervalo de tiempo:
1-- muestra la hora actual:
2SELECT (NOW() + INTERVAL '1 DAY') AS mañana;
Nota
los intervalos podemos manejarlos en minutos, horas, días, semanas y años.
CURRENT_TIME#
1-- devuelve la hora exacta:
2SELECT CURRENT_TIME;
CURRENT_DATE#
1-- devuelve la fecha actual:
2SELECT CURRENT_DATE;
TIMEOFDAY#
1 -- Muestra la fecha en formato completo:
2SELECT TIMEOFDAY();
DATE_PART#
1-- CON DATE_PART podemos comparar la diferencia entre dos fechas:
2SELECT DATE_PART('year', '2015-01-06'::date) - DATE_PART('year', '2002-02-05'::date) AS diferencia_año;
Nota
también se puede sacar la diferencia entre días, semanas, meses y años.
Transacciones#
Para iniciar las transacciones accedemos a la consola de PSQL:
Seleccionamos la base de datos:
\c coleccion
Seleccionamos el esquema para ver todas las tablas y vistas:
SET SEARCH_PATH TO coleccion;
Y ahora podemos listar las tablas:
\d
Commit#
Comenzar una transacción en SQL:
BEGIN TRANSACTION
Insertar un registro (este se quedará temporalmente guardado para el usuario que esta operando pero no lo verán el resto hasta que se comitee):
1INSERT INTO coleccion.consola VALUES ('G-0051', 'Sony', 'PSP', '1994-12-03');
confirmar cambios:
COMMIT;
Rollback#
Comenzar una transacción en SQL:
BEGIN TRANSACTION;
Insertar un registro (este se quedará temporalmente guardado para el usuario que esta operando pero no lo verán el resto hasta que se comitee):
1INSERT INTO coleccion.consola VALUES ('G-0052', 'Sony', 'PSVITA', '1994-12-03');
Comprobamos que esta cargado en la tabla:
SELECT * FROM consola;
eliminar cambios:
ROLLBACK;
Confirmamos que el temporal ya se ha eliminado:
SELECT * FROM consola;
Nota
Este tipo de operación es muy útil cuando guardamos datos en tablas relacionadas y una de las operaciones no ha funcionado correctamente. En ese caso podemos hace rollback y borrar todo lo que ya no sirve.
Roles de usuario#
En PostgreSQL se crea por defecto el superusuario postgres. Sin embargo podemos crear diferentes usuarios los cuales acceden y trabajan con la base de datos. Por otro lado, los roles agregan a estos usuarios y definene los permisos sobre esquemas y objetos de la estructura.
De modo que los privilegios se asignan a los roles y los roles se asignan a los usuarios.
La jerarquía para los permisos es la seguiente: Primero tener permiso para acceder a la base de datos, luego va el permiso a los esquemas y por último a los objetos de la base de datos.
Luego existen dos tipos de privilegios:
privilegios del sistema: los superusuarios (por defecto «postgres»). (CREATEDB, CREATEROLE, CREATEUSER, INHERIT, LOGIN)
privilegios de objeto: los privilegios sobre objetos como la base de datos o los esquemas. (SELECT, INSERT, DELETE, UPDATE, TRUNCATE, USAGE, EXECUTE, CREATE ON)
Crear un rol#
Crear un rol de superusuario:
1-- crear rol de superusuario:
2CREATE ROLE super WITH SUPERUSER;
3
4-- otorgar permiso de uso a un esquema:
5GRANT USAGE ON SCHEMA coleccion TO super;
6
7-- otorgar todos los privilegios a todas las tablas:
8GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA coleccion TO super WITH GRANT OPTION;
9
10-- crear usuario administrador con el rol superusuario:
11CREATE USER admin WITH PASSWORD '1234' IN ROLE super;
Crear un rol para un usuario limitado:
1-- crear rol de usuario básico:
2CREATE ROLE regular_user WITH SUPERUSER;
3
4-- otorgar permiso de uso a un esquema:
5GRANT USAGE ON SCHEMA coleccion TO regular_user;
6
7-- otorgar ciertos privilegios al rol usuario regular:
8GRANT SELECT, INSERT, UPDATE, DELETE ON coleccion.consola, coleccion.juego TO regular_user WITH GRANT OPTION;
9
10-- crear usuario con el rol nuevo:
11CREATE USER regular WITH PASSWORD '1234' IN ROLE regular_user;
Eliminar rol, usuario y revocar privilegios#
1-- Borrar usuario:
2DROP USER regular;
3
4-- Revocar permisos:
5REVOKE SELECT, INSERT, DELETE, UPDATE ON coleccion.juego, coleccion.consola FROM regular_user;
6
7-- Eliminar rol (no pueden existir usuarios o permisos en tablas vinculados a este rol):
8DROP ROLE regular_user;
TODO: REVISAR ESTA PARTE…
PL/SQL#
Es un lenguaje de programación similar a python o java el cual puede crear nuevos tipos de datos o calculos complejos.
Funciones#
Declarar una función#
1-- Creamos una función que retornará un tipo de dato y añadimos los símbolos de dolar:
2CREATE FUNCTION coleccion.HolaMundo() RETURNS VARCHAR(50) AS $$
3-- justo después se declaran las variables:
4DECLARE
5 mensaje VARCHAR(50) := 'Hola mundo';
6BEGIN -- aquí comienza el contenido de ejecución de la función
7RETURN mensaje; -- retornamos el mensaje
8END; -- aquí finaliza la ejecución de la función
9$$ LANGUAGE plpgsql; -- definimos el lenguaje que es plpgsql
Ejecutar una función#
1-- usamos select para ejecutar la función:
2SELECT coleccion.HolaMundo();
Nota
Si queremos crear una función ya existente usamos CREATE OR REPLACE
Eliminar función#
1DROP FUNCTION coleccion.holamundo();
Nota
En PGAdmin podemos desplegar Schema y si desplegamos functions veremos las funciones declaradas.
Uso de parámetros#
1CREATE FUNCTION coleccion.Sumar(num1 INT, num2 INT) -- pasamos los datos con su tipo
2RETURNS INT AS $$ -- retornaremos un tipo entero
3BEGIN
4 RETURN num1 + num2;
5END;
6$$ LANGUAGE plpgsql;
7
8-- ejecutamos la función:
9SELECT coleccion.Sumar(20, 58);
Condicionales#
if / else#
1CREATE FUNCTION coleccion.ComprobarEdad(edad INT)
2RETURNS VARCHAR(50) AS $$
3BEGIN
4 -- comprobamos un numero:
5 IF edad > 65 THEN
6 RETURN 'Con ' || edad || ' has llegado a la tercera edad';
7 ELSIF edad < 18 THEN
8 RETURN 'Con ' || edad || ' eres menor de edad';
9 ELSE
10 RETURN 'Con ' || edad || ' eres mayor de edad';
11 END IF;
12END;
13$$ LANGUAGE plpgsql;
14
15SELECT coleccion.ComprobarEdad(14);
CASE#
1CREATE FUNCTION coleccion.Opciones(opcion INT)
2RETURNS VARCHAR(50) AS $$
3DECLARE
4 mensaje VARCHAR(50) := 'Opción ';
5BEGIN
6 -- esta sentencia funciona igual que switch:
7 CASE
8 WHEN opcion = 1 THEN
9 RETURN mensaje || opcion || ': Ejecutar limpieza del sistema';
10 WHEN opcion = 2 THEN
11 RETURN mensaje || opcion || ': Ejecutar reparación de archivos';
12 WHEN opcion = 3 THEN
13 RETURN mensaje || opcion || ': Ejecutar creación de copia de respaldo';
14 WHEN opcion = 4 THEN
15 RETURN mensaje || opcion || ': Ejecutar análisis del sistema';
16 ELSE
17 RETURN 'No se reconoce la opción';
18 END CASE;
19END;
20$$ LANGUAGE plpgsql;
21
22SELECT coleccion.Opciones(2);
Bucles#
FOR LOOP#
1CREATE FUNCTION coleccion.Bucle(num INT)
2RETURNS INT AS $$
3DECLARE
4 i INT := 1;
5BEGIN
6 FOR i IN 1..num LOOP
7 RAISE NOTICE 'Incrementando %', i;
8 END LOOP;
9END;
10$$ LANGUAGE plpgsql;
11
12SELECT coleccion.Bucle(100);
Nota
Si queremos invertir el bucle de forma descendiente cambiamos el orden de los números: FOR i IN num..1 LOOP
Nota
Si queremos dar saltos mayores usamos by: FOR i IN 1..num BY 2 LOOP
WHILE#
1CREATE FUNCTION coleccion.Mientras(num INT)
2RETURNS INT AS $$
3DECLARE
4 i INT := 0;
5BEGIN
6 WHILE i < num LOOP
7 RAISE NOTICE 'Incrementando %', i;
8 i = i + 1;
9 END LOOP;
10END;
11$$ LANGUAGE plpgsql;
12
13SELECT coleccion.Mientras(20);
Procedimientos#
Crear un procedimiento#
1CREATE PROCEDURE coleccion.InsertarConsola
2(marca VARCHAR(50), modelo VARCHAR(50), lanzamiento DATE, ventas INT)
3LANGUAGE plpgsql AS $$
4DECLARE
5 idCode CHAR(6);
6 idAux CHAR(6);
7BEGIN
8 -- Sacamos el id de la última consola y sumamos uno mas:
9 idCode := (SELECT id FROM coleccion.consola ORDER BY id DESC LIMIT 1);
10 idAux := (SELECT SUBSTRING(idCode, 3, 6));
11 idAux := CAST(idAux AS INT)+1;
12 IF idAux < '9' THEN
13 idCode = 'G-00' || idAux;
14 ELSIF idAux BETWEEN '10' AND '99' THEN
15 idCode = 'G-0' || idAux;
16 ELSIF idAux BETWEEN '100' AND '999' THEN
17 idCode = 'G-' || idAux;
18 END IF;
19
20 -- Ahora creamos la operación de inserción:
21 INSERT INTO coleccion.consola VALUES
22 (idCode, marca, modelo, lanzamiento, ventas);
23
24 RAISE NOTICE 'Se ha añadido el registro % correctamente', idCode;
25END; $$
Ejecutar procedimiento#
1-- Utilizamos call para llamar procedimientos en lugar de select:
2CALL coleccion.InsertarConsola('Sega', 'Dreamcast', '1998-10-10', 93873);
Eliminar procedimiento#
1DROP PROCEDURE coleccion.InsertarConsola();
Nota
En PGAdmin podemos desplegar Schema y si desplegamos procedures veremos los procedimientos declaradas.
Triggers#
Los triggers se ejecutan después de una operación. Por ejemplo al insertar un registro podemos ejecutar un select para visualizar datos.
Crear un Trigger#
1-- crear una tabla donde registrar que usuario ejecutó una operación:
2CREATE TABLE coleccion.consola_operaciones(
3 id SERIAL PRIMARY KEY, -- CREAMOS UNA PRIMARY KEY AUTOINCREMENTADA CON SERIAL
4 accion VARCHAR(50),
5 id_consola VARCHAR(50),
6 modelo_consola VARCHAR(50),
7 nombre_usuario VARCHAR(50),
8 fecha TIMESTAMP
9);
10
11-- Crear la función que dispara el trigger:
12CREATE FUNCTION coleccion.BorradoConsola() RETURNS TRIGGER
13AS $$
14DECLARE
15 usuario VARCHAR(20) := (SELECT CURRENT_USER); -- Averiguar que usuario realizo el borrado.
16 fecha TIMESTAMP := (SELECT LEFT(CAST (CURRENT_TIMESTAMP AS CHAR(30)), 19));
17BEGIN
18 INSERT INTO coleccion.consola_operaciones
19 (accion, id_consola, modelo_consola, nombre_usuario, fecha)
20 -- OLD recupera los últimos datos borrado:
21 VALUES('Borrado', OLD.id, OLD.modelo, usuario, fecha);
22
23 RETURN NEW;
24END;
25$$ LANGUAGE plpgsql;
26
27-- crear el trigger que se ejecutará tras el borrado de un registro en consola:
28CREATE TRIGGER BorrarConsola AFTER DELETE ON coleccion.consola
29FOR EACH ROW
30EXECUTE PROCEDURE coleccion.BorradoConsola();
Ejecutar un Trigger#
Para ejecutar un Trigger basta con ejecutar una operación sql relacionada, en este caso el borrado de un registro:
1-- ejecutar operacion:
2DELETE FROM coleccion.consola WHERE id = 'G-0053';
3-- comprobar que se ha registrado:
4SELECT * FROM coleccion.consola_operaciones;
Eliminar un Trigger#
1DROP TRIGGER BorrarConsola ON coleccion.consola;