はじめに
PostgreSQLの拡張機能pgAuditは、監査ログ(audit logging)を追加するための機能です。
別件のトラブルでpg_statsinfoについて調べていると、Windows版のpg_repackバイナリ配布しているという記事を見つけました。
SRA OSSとしてPostgreSQL拡張のWindowsバイナリ提供を開始しているが、今のところはサポート加入者のみで、一般配布は計画中とのこと。
SRA OSSで継続バイナリリリース
- pg_hint_plan 対応済
- pgaudit
- pg_repack 対応済
- pg_dbms_stats
※2025年06月時点ではまだ一般配布は行われていません。
じゃー自力でなんとかしてみようと考えたところです。
環境
- Windos 11 Home 64bit
- Visual Studio 2022(C++ によるデスクトップ開発) インストール済み
- PostgreSQL 14.7
仕事の関係上、現時点では少し古めの PostgreSQL のバージョンを使用します。
PostgreSQL 14は、2021/09/30リリース
開発準備
pgauditをビルドする上で今回 Visual Studio を使用します。
最初にpgAuditでプロジェクトを作成しましたが、他のdllと合わせpgauditと英小文字にしました。一部のキャプチャにはpgAuditが残っていますがご了承ください。
pgAudit を取得
下記サイトから Source code(zip) を取得します。
筆者は、C:¥WorkSpace に展開しました。
プロジェクト作成
C++でダイナミックリンクライブラリ(DLL)を選択します。

pgaudit でプロジェクトを作成します。
プロジェクトを一旦閉じます。
同じ拡張機能のpg_repackに倣って、pgauditフォルダからmsvcに変更したらプロジェクトを開き直します。

ファイルの追加の既存ファイル削除
上位フォルダから「pgaudit.c」ファイルを追加します。
あと、既存ファイルの下記ファイルは不要なので削除します。
- dllmain.cpp
- pch.cpp
- framework.h
- pch.h
定義ファイルの作成
モジュール定義ファイル(.def)を作成して、msvcフォルダに配置します。
LIBRARY pgaudit
EXPORTS
_PG_init
pgaudit_ddl_command_end
pgaudit_sql_drop
プロパティ設定
pgauditでプロジェクトのプロパティにて、構成を「すべての構成」にします。
プリプロセッサ定義
C/C++の「プリプロセッサ」を選択、「プリプロセッサの定義」に「WIN32」を追加します。
PostgreSQLは「WINDLL」を同等のものとして認識しないため、Win32プラットフォームの場合は明示的に指定する必要があります。
※2014年の記事を参考にしているため、もう改善されている可能性があります。
C/C++の例外を無効化
C/C++の「コード生成」を選択、「C/C++の例外を有効にする」で「いいえ」にします。

コンパイルをC言語へ
C/C++の「詳細設定」を選択、「コンパイル言語の選択」で「C コードとしてコンパイル(/TC)」にします。
次に「指定の警告を無視する」を「4703;4996」をセットします。

- 4703…未使用要素
- 4996…非推奨関数
4996の非推奨関数の警告を無視したくない場合、#define _CRT_SECURE_NO_WARNINGSの指定やstrcpyの代わりにstrcpy_sへ書き換える方法もあります。
プリコンパイル済みヘッダーを使用しない
C/C++の「プリコンパイル済みヘッダー」を選択、「プリコンパイル済みヘッダー」で「プリコンパイル済みヘッダーを使用しない」にします。

マニフェストを生成しない
リンカーの「マニフェスト ファイル」を選択、「マニフェストの生成」で「いいえ (/MANIFEST:NO)」にします。

追加の依存関係
リンカーの「入力」を選択、「追加の依存ファイル」に「postgres.lib」を追加します。

「親またはプロジェクトの既定値から継承」のチェックは外さないでください。
単純な拡張機能では必要ありませんが、サーバー関数にリンクする場合は必要になります。

モジュール定義関係
モジュール定義ファイル「pgaudit.def」をセットします。

インクルードディレクトリ
C/C++の「全般」を選択、「追加のインクルードディレクトリ」で、PostgreSQLインストール配下の4つのフォルダを追加します。
- include\server\port\win32_msvc
- include\server\port\win32
- include\server
- include
今回の筆者の場合、PostgreSQLインストールフォルダは「C:\Program Files\PostgreSQL\14」になります。

ライブラリディレクトリ
リンカーの「全般」を選択、「追加のライブラリ ディレクトリ」で、PostgreSQLインストール配下のlibフォルダを追加します。
次に「ライブラリ依存関係のリンク」を「いいえ」にします。

プロジェクトの構築
プログラム
構成
msvcフォルダの中身、x64¥Releseフォルダに「pgaudit.dll」ファイルが生成される。
導入
配置
今回の筆者の場合、PostgreSQLインストールフォルダは「C:¥Program Files¥PostgreSQL¥14」になりますので、下記に配置します。
| ファイル | 配置先 |
|---|---|
| pgaudit.dll | lib |
| pgaudit.control | share\extension |
| pgaudit--1.6.3.sql | 同上 |
pgaudit.control に書かれたdefault_version(例: 1.6.3)のように、バージョン3桁のみのファイル(例 1.6.3.sql)があったため、他のsqlは含めませんでした。
他バージョンでバージョン3桁のsqlファイルがない場合、アップグレードさせるために他のsqlを含めてください。
postgres.confの修正
設定ファイルにpgauditの事前ロード用の設定を追加します。
shared_preload_libraries = 'pgaudit'
ファイル編集後、PostgreSQLサーバを起動、または再起動してください。
※shared_preload_librariesには、カンマ区切りで複数のモジュールが登録できます。
shared_preload_libraries = 'pg_hint_plan, pgaudit'
PostgreSQLに拡張機能の登録
CREATE EXTENSION pgaudit;
登録の確認
SELECT extname, extversion
FROM pg_extension
WHERE extname = 'pgaudit';
| extname | extversion |
|---|---|
| pgaudit | 1.6.3 |
検証
postgres.conf追加設定
#------------------------------------------------------------------------------
# pgaudit
#------------------------------------------------------------------------------
pgaudit.log = 'ALL'
pgaudit.log_catalog = off
pgaudit.log_level = log
pgaudit.log_parameter = on
pgaudit.log_relation = on
pgaudit.log_statement_once = off
pgaudit.role = 'auditmrole'
検証データ作成
下記サイトを参考にしました。
auditmroleマスターロールの作成
オブジェクト監査ロギングの対象ロールとして auditmrole マスターロールを作成します。
CREATE ROLE auditmrole;
マスターロールへの権限の付与
auditmrole マスターロールに table1 テーブルの t1 カラムへの SELECT の権限を与えます。
CREATE TABLE table1 (id int, t1 text);
INSERT INTO table1 VALUES (1, 'aaa'),(2, 'bbb');
SELECT * FROM table1;
GRANT SELECT (t1) on table1 to auditmrole;
マスターロールでの種々の操作と監査ログ
t1 カラムを含む SELECT と t1 カラムを含まない SELECT を実施します。
SELECT * FROM table1;
SELECT id FROM table1;
SELECT id,t1 FROM table1;
auditmrole ロールに与えられた権限の通り、t1 カラムを含む SELECT は記録(AUDIT_TYPEがOBJECT)されましたが、t1 カラムを含まないidカラムのみの SELECT 文は記録されませんでした。このようにオブジェクト監査ロギングでは auditmrole ロールに与えられた権限のみが PostgreSQL ログに記録されますので詳細なレベルで取得する情報を設定できます。
2025-06-22 23:20:29.253 JST [16948] LOG: AUDIT: OBJECT,17,1,READ,SELECT,TABLE,test.table1,SELECT * FROM table1,<none>
2025-06-22 23:20:29.253 JST [16948] LOG: AUDIT: SESSION,17,1,READ,SELECT,TABLE,test.table1,SELECT * FROM table1,<none>
2025-06-22 23:20:34.568 JST [16948] LOG: AUDIT: SESSION,18,1,READ,SELECT,TABLE,test.table1,SELECT id FROM table1,<none>
2025-06-22 23:20:38.236 JST [16948] LOG: AUDIT: OBJECT,19,1,READ,SELECT,TABLE,test.table1,"SELECT id,t1 FROM table1",<none>
2025-06-22 23:20:38.236 JST [16948] LOG: AUDIT: SESSION,19,1,READ,SELECT,TABLE,test.table1,"SELECT id,t1 FROM table1",<none>
最後に
pg_hint_planの経験があったので、比較的スムーズにビルドすることが出来ました。
簡易的なテストしかしていませんが、問題ないかと思います。





