이 테이블을 사용하는 프로그램이 있는데 프로그램을 수정하지 않고 로깅에 몇 가지 추가 기능을 추가하고 싶습니다.
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에 "group456에 추가된 user123" 또는 "group456에서 제거된 user123" 메시지를 쓰고 싶습니다.
내 첫 번째 생각은 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();
내 방식이 좋은 걸까? 그렇다면 이 함수에서 syslog에 어떻게 기록합니까?
rsyslog를 사용하여 CentOS 7에서 postgresql 9.2를 사용하고 있습니다.
답변1
로깅을 올바르게 구성한 경우(옵션 참조)18.8.2. When To Log.
PostgreSQL: 문서: 9.1: 오류 보고 및 로깅 postgresql.org |) 그리고 로그 대상이 syslog이면 이를 사용하여 RAISE
무언가를 기록할 수 있습니다. 자세한 내용은 여기에서 확인할 수 있습니다.PostgreSQL: 문서: 8.3: 오류 및 메시지 postgresql.org |
답변2
내가 아는 한, 트리거에서 syslog 메시지를 생성하는 직접적인 방법은 없지만 이 작업을 수행하기 위해 외부 프로그램을 사용하는 것을 고려할 수 있습니다. 그러나 다음을 참조하십시오:PostgreSQL 트리거에서 외부 프로그램 호출트리거 내부의 외부 프로그램을 고려하는 경우. 데이터베이스 내의 감사 테이블에 메시지를 삽입하고 추가 작업("사용자 추가 또는 제거"와 같은 이벤트를 확인하기 위해 폴링 :-( 폴링)을 생성하는 경우 옵션이 있습니다.