当前位置: 首页 > postgresql > 正文

使用触发器来实现postgresql数据库的审计功能

最简单的一种审计方式,使用触发器来实现:

1. 基本表

CREATE TABLE emp (
    empname           text NOT NULL,
    salary            integer
);

2. 建立审计表,主要记录操作,时间,操作用户等信息

CREATE TABLE emp_audit( 
    operation         char(1)   NOT NULL,
    stamp             timestamp NOT NULL,
    userid            text      NOT NULL,
    empname           text      NOT NULL,
    salary            integer
);

3. 具体操作的函数(注意:postgresql不支持存储过程)

CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
    BEGIN
        --
        -- Create a row in emp_audit to reflect the operation performed on emp,
        -- make use of the special variable TG_OP to work out the operation.
        --
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
            RETURN NEW;
        END IF;
        RETURN NULL; -- result is ignored since this is an AFTER trigger
    END;
$emp_audit$ LANGUAGE plpostgresql;

4. 建立触发器

CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
    FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();

这样,每次对emp进行操作(INSERT,UPDATE,DELETE)的时候,就会进行记录了。
缺点:
1.对于oltp的系统,由于表中数据的更改很频繁,审计记录将会很多,需要定时的清除审计信息
2.对于表结构修改的操作(DML语句),该方式无法记录
3.对于表数据不幸删除或者其他误操作的恢复时,可能需要一个友好的恢复方案。

to be continued ..

    分享到:

本文固定链接: http://klwang.info/pgsql-aduit-method-of-trigger/ | 数据库|Linux|软件开发

该日志由 klwang 于2013年03月13日发表在 postgresql 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 使用触发器来实现postgresql数据库的审计功能 | 数据库|Linux|软件开发

使用触发器来实现postgresql数据库的审计功能:等您坐沙发呢!

发表评论

*
快捷键:Ctrl+Enter