Você está na página 1de 16

SQL: Vistas, Triggers, y Procedimientos Almacenados

Dr. Gerardo Rossel

Bases de Datos

1C 2018
PostgreSQL

Aclaración
En estas diapositivas nos basaremos principalmente en PostgreSQL.
Diferentes motores de bases de datos tienen diferencias de sintaxı́s y
organización.

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 2 / 13
Vistas

Son relaciones pero de las cuales solo almacenamos su definición, no


su conjunto de filas.

Sintaxis
CREATE [ OR REPLACE ][ TEMP | TEMPORARY ][ RECURSIVE ] VIEW name
[( column_name [ , ...] ) ]
[ WITH ( v i e w _o p t i o n _ n a m e [= v i e w _ o p t i o n _ v a l u e ][ , ...]) ]
AS query [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 3 / 13
Vistas

Son relaciones pero de las cuales solo almacenamos su definición, no


su conjunto de filas.

Sintaxis
CREATE [ OR REPLACE ][ TEMP | TEMPORARY ][ RECURSIVE ] VIEW name
[( column_name [ , ...] ) ]
[ WITH ( v i e w _o p t i o n _ n a m e [= v i e w _ o p t i o n _ v a l u e ][ , ...]) ]
AS query [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

Ejemplo
CREATE OR REPLACE VIEW public . album_artist AS
SELECT artist . name , album . album_id , album . title , album . artist_id
FROM artist , album
WHERE artist . artist_id = album . artist_id ;

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 3 / 13
Vistas - Ventajas

Simplificar consultas complejas mejorando la modularidad


Reducir la cantidad de código SQL
Mejorar la seguridad del acceso a datos, incluso a nivel fila
Implementar interfaces y una capa de abstracción entre lenguajes de
alto nivel y la base de datos
Facilita la implementación de requisitos sin cambiar la base de datos
El árbol de dependencias de las vistas es mantenido por la Base de
Datos

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 4 / 13
Vistas Materializadas

Son vistas que si bien representan una visión lógica de los datos son
almacenadas en disco.
Usadas principalmente en data warehouses y aplicaciones de Business
Intelligence

Sintaxis
CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] table_name
[( column_name [ , ...]) ]
[ WITH ( s t or a g e _ p a r a m e t e r [= value ][ , ... ]) ]
[ TABLESPACE t ab l es pa ce _ na me ]
AS query [ WITH [ NO ] DATA

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 5 / 13
Procedimientos Almacenados (Stored Procedures)

Es una porción de código, que se almacena en el catálogo de la base


de datos y se puede invocar mediante una sentencia SQL.
Se ejecuta en el servidor de base de datos. Reduce el número de idas
y vueltas entre aplicaciones y el servidor de base de datos.
Encapsulan reglas de negocio fuertemente relacionadas con los datos
de la BD y sin interacción con el usuario
No es obligatorio que esten escritos en SQL (Java, PL/SQL,
PL/pgSQL, Transact SQL)
Cada RDBMS tiene su propio lenguaje de Stored Procedure, los
cuales incluyen sentencias de control, manejo de variables, etc.
Los Stored Procedures, tienen un nombre, reciben parametros y
pueden devolver resultados
Permite reutilizar código entre diversas aplicaciones

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 6 / 13
Procedimientos Almacenados (Stored Procedures)

Es una porción de código, que se almacena en el catálogo de la base


de datos y se puede invocar mediante una sentencia SQL.
Se ejecuta en el servidor de base de datos. Reduce el número de idas
y vueltas entre aplicaciones y el servidor de base de datos.
Encapsulan reglas de negocio fuertemente relacionadas con los datos
de la BD y sin interacción con el usuario
No es obligatorio que esten escritos en SQL (Java, PL/SQL,
PL/pgSQL, Transact SQL)
Cada RDBMS tiene su propio lenguaje de Stored Procedure, los
cuales incluyen sentencias de control, manejo de variables, etc.
Los Stored Procedures, tienen un nombre, reciben parametros y
pueden devolver resultados
Permite reutilizar código entre diversas aplicaciones

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 7 / 13
Procedimientos Almacenados (Stored Procedures)
Velocidad de desarrollo mas lenta.
Requiere habilidades especiales
Es dificultoso manejar versiones y es mas complejo depurar
No son portables entre diverentes sistemas de bases de datos.

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 8 / 13
Procedimientos Almacenados (Stored Procedures)
Velocidad de desarrollo mas lenta.
Requiere habilidades especiales
Es dificultoso manejar versiones y es mas complejo depurar
No son portables entre diverentes sistemas de bases de datos.

Sintaxis
CREATE OR REPLACE FUNCTION suma ( p1 integer DEFAULT 0 , p2 integer
DEFAULT 0) RETURNS integer
LANGUAGE ’ plpgsql ’ AS
$BODY$
BEGIN
return p1 + p2 ;
END
$BODY$ ;

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 8 / 13
Procedimientos Almacenados (Stored Procedures)
Velocidad de desarrollo mas lenta.
Requiere habilidades especiales
Es dificultoso manejar versiones y es mas complejo depurar
No son portables entre diverentes sistemas de bases de datos.

Sintaxis
CREATE OR REPLACE FUNCTION suma ( p1 integer DEFAULT 0 , p2 integer
DEFAULT 0) RETURNS integer
LANGUAGE ’ plpgsql ’ AS
$BODY$
BEGIN
return p1 + p2 ;
END
$BODY$ ;

Llamado
select suma (2 ,2) ;

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 8 / 13
Procedimientos Almacenados

pgsql
CREATE OR REPLACE FUNCTION public . getrecords ( tabla text ) RETURNS
integer
LANGUAGE ’ plpgsql ’
AS $BODY$
DECLARE
total INTEGER ;
BEGIN
EXECUTE ’ SELECT COUNT (*) FROM ’ || quote_ident ( tabla ) INTO total
;
RETURN total ;
END ;
$BODY$ ;

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 9 / 13
Procedimientos Almacenados

SQL
CREATE OR REPLACE FUNCTION ge ta rt i st al bu m s ()
RETURNS TABLE ( artist character varying (120) , title character
varying (160) )
LANGUAGE ’ sql ’
AS $BODY$
SELECT artist . name as artist , album . title as title
FROM artist , album
WHERE artist . artist_id = album . artist_id
$BODY$ ;

SQL
SELECT * FROM g e ta rt is t al bu ms ()

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 10 / 13
Triggers/Disparadores

Código almacenado en la DB que se ejecuta ante ciertos eventos.


Evento: activa el trigger
Acción: código que se ejecuta si se dispara el trigger

En postgresql hay dos tipos de triggers: a nivel fila o a nivel sentencia.

Sintaxis
CREATE TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF }{ event [ OR ...}
ON table_name [ FOR [ EACH ]{ ROW | STATEMENT }]
EXECUTE PROCEDURE t r i g g e r _ f u n c t i o n _ n a m e

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 11 / 13
Triggers Ejemplo
Auditorı́a de cambios de salarios
CREATE TABLE emp_audit ( emp_audit_id integer , up_date DATE ,
new_sal decimal , old_sal decimal ) ;

Crear Función
CREATE OR REPLACE FUNCTION a c t u a l i z a r _ a u d i t o r i a ()
RETURNS trigger AS
$BODY$BEGIN
insert into emp_audit values ( old . ecod , CURRENT_DATE , new . salario ,
old . salario ) ;
return null
END$BODY$
LANGUAGE plpgsql ;

Crear Trigger
CREATE TRIGGER audit_sal AFTER UPDATE OF salario
ON empleados FOR EACH ROW
WHEN ( OLD . salario IS DISTINCT FROM NEW . salario )
EXECUTE PROCEDURE a c t u a l i z a r _ a u d i t o r i a () ;

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 12 / 13
¿Cómo serı́a en SQL Server?

Definiendo un trigger en TSQL


-- Auditor ı́ a de cambios de salarios
CREATE TABLE emp_audit ( emp_audit_id integer , up_date DATE ,
new_sal decimal , old_sal decimal ) ;
--
CREATE TRIGGER audit_sal ON empleados AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON ;
IF UPDATE ( salario ) -- Solo si se actualiza salario
BEGIN
INSERT INTO emp_audit ( emp_audit_id , up_date , new_sal , old_sal )
SELECT i . ecod , getdate () ,i . salario , d . salario
FROM Inserted i INNER JOIN Deleted d ON i . ecod = d . ecod
END
END

Dr. Gerardo Rossel (Bases de Datos) SQL: Vistas, Triggers, y Procedimientos Almacenados 13 / 13

Você também pode gostar