Professional Documents
Culture Documents
NOTA: EN caso de que se requiera eliminar el lenguaje de la base de datos utilizamos el siguiente
comando:
droplang -h localhost -U postgres plpgsql Peliculas
Crear una tabla llamada tbl_audit, donde se guardan cada una de las transacciones realizadas:
CREATE TABLE tbl_audit (
pk_audit serial NOT NULL,
"TableName" character(45) NOT NULL,
"Operation" char(1) NOT NULL,
"OldValue" text,
"NewValue" text,
"UpdateDate" timestamp without time zone NOT NULL,
"UserName" character(45) NOT NULL,
CONSTRAINT pk_audit PRIMARY KEY (pk_audit))
WITH (OIDS=FALSE);
ALTER TABLE tbl_audit OWNER TO postgres;
Creamos una funcin en PL/PgSQL que nos permite insertar los datos de aquellos registros que
son afectados cada vez que se realiza una accin de tipo INSERT, UPDATE y DELETE en una
tabla determinada, la cual es definida en la creacin del Trigger.
CREATE OR REPLACE FUNCTION fn_log_audit() RETURNS trigger AS
$$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO tbl_audit ("TableName", "Operation", "OldValue", "NewValue", "UpdateDate",
"UserName")
VALUES (TG_TABLE_NAME, 'D', OLD, NULL, now(), USER);
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO tbl_audit ("TableName", "Operation", "OldValue", "NewValue", "UpdateDate",
"UserName")
VALUES (TG_TABLE_NAME, 'U', OLD, NEW, now(), USER);
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO tbl_audit ("TableName", "Operation", "OldValue", "NewValue", "UpdateDate",
"UserName")
VALUES (TG_TABLE_NAME, 'I', NULL, NEW, now(), USER);
RETURN NEW;
END IF;
RETURN NULL;
END;
$$
LANGUAGE 'plpgsql' VOLATILE COST 100;
ALTER FUNCTION fn_log_audit() OWNER TO postgres;
Crear el Trigger en todas las tablas menos en "tbl_audit", para este caso de ejemplo usamos la
tabla tbl_atributos, indicando que ser ejecutado el trigger antes de la ejecucin de una instruccin
INSERT, UPDATE y DELETE para cada registro y le asignamos la funcin anterior.
CREATE TRIGGER tbl_atributos_tg_audit
AFTER INSERT OR UPDATE OR DELETE
ON tbl_atributos
FOR EACH ROW
EXECUTE PROCEDURE fn_log_audit();
Por ultimo realizaremos una serie de consultas para poner en practica el registro de transacciones:
INSERT INTO tbl_atributos (fk_tipo, nombre) VALUES (1, 'Femenido');
UPDATE tbl_atributos SET nombre = 'Masculino' WHERE pk_atributo = 2;
DELETE FROM tbl_atributos WHERE pk_atributo = 2;
Al hacer una seleccin de los datos de la tabla tbl_audit podemos observar en cada uno de los
registros la accin que se le realiz a una determinada tabla, cuales son los datos antiguos y
nuevos como la fecha de cuando fueron registrados. Por otro lado se registra el usuario que realizo
la accin sobre los datos, en este caso si el usuario que se conecto al manejador de base de datos
es "postgres", ser el responsable de los registros alterados, para corregir este "posible defecto" de
poder utilizar otro "valor" que represente a un "usuario real del sistema" puede utilizar las variables
de sesin que se mencionaron en un post anterior y ajusta la funcin "fn_log_audit".
http://www.swapbytes.com/2010/09/como-implementar-auditoria-simple-en.html