我有一个使用这些表的程序,我想在不修改程序的情况下向其日志记录添加一些附加功能。
groups
------
id bigint not null
name character varying(100) not null
users
-----
id bigint not null
name character varying(100) not null
users_groups
------------
group_id bigint not null
user_id bigint not null
每次从组中添加或删除用户时,我想在 syslog6 中写入“user123 添加到 group456”或“user123 从 group456 中删除”消息。
我的第一个想法是使用 PostgreSQL 触发器。
CREATE OR REPLACE FUNCTION process_ext_audit()
RETURNS trigger AS $ext_audit$
BEGIN
IF (TG_OP = 'DELETE') THEN
SELECT name
into uname
FROM users
WHERE id = OLD.user_id;
SELECT name
into gname
FROM groups
WHERE id = OLD.group_id;
-- write into local6: "uname removed from gname"
ELSIF (TG_OP = 'INSERT') THEN
SELECT name
into uname
FROM users
WHERE id = NEW.user_id;
SELECT name
into gname
FROM groups
WHERE id = NEW.group_id;
-- write into local6: "uname added to gname"
END IF;
RETURN NULL;
END;
$ext_audit$ LANGUAGE plpgsql;
CREATE TRIGGER ext_audit
AFTER INSERT OR DELETE ON users_groups
FOR EACH ROW EXECUTE PROCEDURE process_ext_audit();
我的方法好不好?如果是,我如何从这个函数写入系统日志?
我将 postgresql 9.2 与使用 rsyslog 的 CentOS 7 一起使用。
答案1
如果您已正确配置日志记录(请参阅选项18.8.2. When To Log.
PostgreSQL:文档:9.1:错误报告和日志记录 | postgresql.org)并且您的日志目的地是 syslog,那么您可以用来RAISE
记录某些内容。更多信息可以在这里找到:PostgreSQL:文档:8.3:错误和消息 | postgresql.org
答案2
据我所知,没有直接的方法从触发器生成系统日志消息,但您可以考虑使用外部程序来完成此任务。但请参阅:从 PostgreSQL 触发器调用外部程序如果您考虑触发器内的外部程序。如果您将消息插入数据库内的审核表并创建一个额外的任务(轮询:-( 来检查“添加或删除用户”等事件),就会有一个选项。