Sei sulla pagina 1di 18

Sistema de Reglas

Curso Base de Datos


Facultad de Ciencias, UNI
Junio, 2019
SISTEMA DE REGLAS EN POSTGRESQL

• El sistema de reglas de PostgreSQL nos permite


definir una acción alternativa a realizar en las
operaciones de inserción, actualización o
eliminación en las tablas de la base de datos.
• En términos generales, una regla hace que se
activen comandos adicionales cuando se ejecuta
una operación determinada en una tabla
determinada.
REGLAS EN POSTGRESQL
• El comando responsable de la creación de una
regla es CREATE RULE.
• Su sintaxis se muestra a continuación:
Sintaxis
CREATE RULE nombre AS ON evento
TO objeto [ WHERE condicion ]
DO [ INSTEAD ] [ accion | NOTHING ]

nombre - El nombre de la regla a crear.


evento - Evento puede ser select, update, delete o insert.
objeto - Objeto puede ser table o table.column.
condicion - Cualquier cláusula, SQL WHERE, New o Current, pueden aparecer
en lugar de una variable de instancia siempre que una variable de instancia es
admisible en SQL .
accion - Cualquier cláusula SQL, New o Current pueden aparecer en lugar de una
variable de instancia siempre que una variable de instancia sea admisible en SQL.
Variables Especiales en PostgreSQL
NEW
Tipo de dato RECORD; Variable que contiene la
nueva fila de la tabla para las operaciones
INSERT/UPDATE.

OLD
Tipo de dato RECORD; Variable que contiene la
antigua fila de la tabla para las operaciones
UPDATE/DELETE.
Ejemplo
• Considere la tabla Empleado que mantiene los
datos de empleados de una empresa.

CREATE TABLE Empleado(


n_emp integer,
nombre_emp varchar(80),
cargo varchar(30),
jefe integer,
fecha_ing date,
salario numeric(10,2));
Ejemplo
• Vamos a crear una regla de auditoría para la tabla
Empleado, que mantiene los datos de empleados
de una empresa.

En los ejemplos utilizaremos las funciones


current_user, que devuelve el usuario conectado
a la base de datos, y el current_timestamp,
que devuelve la fecha y la hora actual.
Ejemplo
• El primer paso es crear una tabla de auditoría
que se actualizará cada vez que se modifique
el salario de un empleado.

• Esta tabla tendrá el número de empleado


(n_emp), el nuevo salario (nuevo_sal), el
usuario que efectuó el cambio (usuario) y la
fecha más la hora en la que se produjo el
cambio (fecha).
Ejemplo
• Creamos la tabla emp_log

CREATE TABLE emp_log (


n_emp int,
nuevo_sal decimal(10,2),
usuario varchar(50),
fechahora timestamp);
Ejemplo
• Se muestra el comando para crear la regla

CREATE RULE log_emp_rule AS


ON UPDATE TO emp
WHERE NEW.sal <> OLD.sal
DO INSERT INTO emp_log
VALUES (NEW.n_emp, NEW.sal, current_user,
current_timestamp);
Ejemplo
Tenga en cuenta que la parte destacada en el
Listado 2 muestra que esta regla sólo se
activará cuando el nuevo salario (NEW.sal) y
el salario antiguo (OLD.sal) sean diferentes, lo
que indica un cambio en el valor de la
columna sal, contiene el salario de los
empleados.
Ejemplo
Tenga en cuenta que la parte destacada en el
Listado 2 muestra que esta regla sólo se
activará cuando el nuevo salario (NEW.sal) y
el salario antiguo (OLD.sal) sean diferentes, lo
que indica un cambio en el valor de la
columna sal, contiene el salario de los
empleados.
Ejemplo
El siguiente comando actualiza el salario de un
determinado empleado y activa la regla
log_emp_rule insertando un nuevo registro
en la tabla de auditoría:

UPDATE emp SET sal = sal * 1.1


WHERE n_emp = 110;

Un detalle importante es que si hay más de una regla en una


tabla, el orden de accionamiento sigue el orden alfabético del
nombre de las reglas.
Sustitución de comandos
Para reemplazar un comando original por
aquellos definidos en la acción de una regla,
basta con utilizar la palabra clave INSTEAD. A
continuación el Listado anterior reescrito.

CREATE RULE log_emp_rule AS


ON UPDATE TO emp
WHERE NEW.sal <> OLD.sal
DO INSTEAD INSERT INTO emp_log VALUES
(NEW.n_emp,
NEW.sal, current_user, current_timestamp);
Sustitución de comandos
Esta nueva regla establece que el comando
original de actualización que activa la regla se
omite, ejecutando sólo el comando
complementario definido.

Si el comando de actualización anterior se


ejecuta, con esta nueva regla, la tabla emp no
se verá afectada, pero el intento de hacerlo se
guardará en la tabla emp_log.
Ignorar comandos
Para omitir el comando original y no definir
acciones complementarias, se puede utilizar la
palabra clave NOTHING junto con el INSTEAD.
El Listado siguiente muestra el comando
anterior reescrito.

CREATE RULE log_emp_rule AS


ON UPDATE TO emp
WHERE NEW.sal <> OLD.sal
DO INSTEAD NOTHING;
Ignorar comandos

Si un comando activa esta regla, se omite sin


generar ningún tipo de error para el usuario, y
las tablas empy emp_log no tendrán ningún
cambio.
Borrar una regla

DROP RULE NombreRegla ON Tabla

donde:
NombreRegla: nombre de la regla que se
borrará.
Tabla: nombre de la tabla donde se encuentra
la regla.

Potrebbero piacerti anche