このテーブルを使用するプログラムがありますが、プログラムを変更せずにロギングにいくつかのアドインを追加したいと思います。
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トリガーから外部プログラムを呼び出すトリガ内部の外部プログラムを考慮する場合。データベース内の監査テーブルにメッセージを挿入し、追加操作(「ユーザーの追加または削除」などのイベントを確認するためにポーリング:-(ポーリング)を生成する場合)、オプションがあります。