PostgreSQL中insert_username的擴(kuò)展使用
insert_username 是 PostgreSQL 的一個(gè)實(shí)用擴(kuò)展,用于自動(dòng)記錄數(shù)據(jù)行的創(chuàng)建者和最后修改者信息。這個(gè)擴(kuò)展特別適合需要審計(jì)跟蹤的應(yīng)用場(chǎng)景。
一 擴(kuò)展安裝與啟用
1.1 安裝擴(kuò)展
-- 使用超級(jí)用戶安裝 CREATE EXTENSION insert_username;
1.2 驗(yàn)證安裝
-- 查看已安裝擴(kuò)展 SELECT * FROM pg_available_extensions WHERE name = 'insert_username'; -- 查看擴(kuò)展提供的函數(shù) \df+ insert_username.*
輸出示例:
white=# CREATE EXTENSION insert_username;
CREATE EXTENSION
white=# SELECT * FROM pg_available_extensions WHERE name = 'insert_username';
name | default_version | installed_version | comment
-----------------+-----------------+-------------------+--------------------------------------------
insert_username | 1.0 | 1.0 | functions for tracking who changed a table
(1 row)
white=# \df+ insert_username.*
List of functions
Schema | Name | Result data type | Argument data types | Type | Volatility | Parallel | Owner | Security | Access privileges | Language | Internal name | D
escription
--------+------+------------------+---------------------+------+------------+----------+-------+----------+-------------------+----------+---------------+--
-----------
(0 rows)
white=#
二 基本功能與使用
2.1 核心功能
該擴(kuò)展提供兩個(gè)主要功能:
- 自動(dòng)插入當(dāng)前用戶名到指定列(記錄創(chuàng)建者)
- 自動(dòng)更新當(dāng)前用戶名到指定列(記錄最后修改者)
2.2 基本用法示例
-- 創(chuàng)建測(cè)試表
CREATE TABLE documents (
id serial PRIMARY KEY,
content text,
created_by text, -- 記錄創(chuàng)建者
modified_by text -- 記錄最后修改者
);
-- 為表添加觸發(fā)器
CREATE TRIGGER track_document_users
BEFORE INSERT OR UPDATE ON documents
FOR EACH ROW EXECUTE FUNCTION insert_username();
輸出示例:
white=# CREATE TABLE yewu1.documents (
white(# id int,
white(# name varchar(20),
white(# created_by text,
white(# modified_by text
white(# );
CREATE TABLE
white=# CREATE TRIGGER track_document_users
white-# BEFORE INSERT OR UPDATE ON yewu1.documents
white-# FOR EACH ROW EXECUTE FUNCTION insert_username();
CREATE TRIGGER
white=#
white=# \d yewu1.documents
Table "yewu1.documents"
Column | Type | Collation | Nullable | Default
-------------+-----------------------+-----------+----------+---------
id | integer | | |
name | character varying(20) | | |
created_by | text | | |
modified_by | text | | |
Triggers:
track_document_users BEFORE INSERT OR UPDATE ON yewu1.documents FOR EACH ROW EXECUTE FUNCTION insert_username()
三 高級(jí)配置選項(xiàng)
3.1 自定義列名
-- 創(chuàng)建使用不同列名的表
CREATE TABLE projects (
id serial PRIMARY KEY,
name text,
creator text, -- 替代 created_by
last_editor text -- 替代 modified_by
);
-- 使用參數(shù)指定列名
CREATE TRIGGER track_project_users
BEFORE INSERT OR UPDATE ON projects
FOR EACH ROW EXECUTE FUNCTION insert_username('creator', 'last_editor');
3.2 選擇性應(yīng)用
-- 只跟蹤創(chuàng)建者
CREATE TRIGGER track_creator_only
BEFORE INSERT ON projects
FOR EACH ROW EXECUTE FUNCTION insert_username('creator', NULL);
-- 只跟蹤修改者
CREATE TRIGGER track_editor_only
BEFORE UPDATE ON projects
FOR EACH ROW EXECUTE FUNCTION insert_username(NULL, 'last_editor');
四 擴(kuò)展內(nèi)部原理
4.1 實(shí)現(xiàn)機(jī)制
insert_username 擴(kuò)展實(shí)際上創(chuàng)建了一個(gè)觸發(fā)器函數(shù),該函數(shù):
- 在 INSERT 操作時(shí)設(shè)置
created_by列為當(dāng)前用戶名 - 在 UPDATE 操作時(shí)設(shè)置
modified_by列為當(dāng)前用戶名
4.2 使用的PostgreSQL特性
- 觸發(fā)器函數(shù)
current_user系統(tǒng)函數(shù)- 可變參數(shù)處理
五 性能考慮
5.1 性能影響
- 觸發(fā)器增加的開(kāi)銷(xiāo)通常很小
- 每行操作增加少量CPU時(shí)間
- 不影響查詢性能,只影響DML操作
5.2 優(yōu)化建議
-- 對(duì)大表考慮禁用觸發(fā)器進(jìn)行批量操作 ALTER TABLE large_table DISABLE TRIGGER track_large_table_users; -- 批量更新操作 UPDATE large_table SET ...; -- 重新啟用觸發(fā)器 ALTER TABLE large_table ENABLE TRIGGER track_large_table_users;
六 與其他擴(kuò)展的對(duì)比
| 特性 | insert_username | temporal_tables | pg_audit |
|---|---|---|---|
| 用戶跟蹤 | ? | ? | ? |
| 時(shí)間跟蹤 | ? | ? | ? |
| 完整審計(jì) | ? | ? | ? |
| 使用復(fù)雜度 | 簡(jiǎn)單 | 中等 | 復(fù)雜 |
| 性能影響 | 低 | 中 | 高 |
七 最佳實(shí)踐
命名一致性:在所有表中使用相同的列名(如created_by/modified_by)
組合使用:與時(shí)間戳觸發(fā)器結(jié)合使用
權(quán)限控制:
-- 防止手動(dòng)修改跟蹤列 REVOKE UPDATE ON created_by FROM public;
文檔記錄:在數(shù)據(jù)庫(kù)文檔中記錄審計(jì)策略
異常處理:考慮添加錯(cuò)誤處理邏輯
八 限制與注意事項(xiàng)
- 不記錄超級(jí)用戶的更改(如postgres用戶)
- 需要觸發(fā)器權(quán)限才能創(chuàng)建相關(guān)觸發(fā)器
- 不會(huì)跟蹤DELETE操作
- 在多語(yǔ)句事務(wù)中,用戶名是事務(wù)開(kāi)始時(shí)的用戶
insert_username擴(kuò)展提供了輕量級(jí)、簡(jiǎn)單易用的用戶變更跟蹤功能,非常適合基本的審計(jì)需求,但對(duì)于復(fù)雜的審計(jì)場(chǎng)景可能需要更全面的解決方案。
到此這篇關(guān)于PostgreSQL中insert_username的擴(kuò)展的文章就介紹到這了,更多相關(guān)PostgreSQL insert_username擴(kuò)展內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 在PostgreSQL上安裝并使用擴(kuò)展模塊的教程
- postgresql 中的加密擴(kuò)展插件pgcrypto用法說(shuō)明
- PHP實(shí)現(xiàn)基于PDO擴(kuò)展連接PostgreSQL對(duì)象關(guān)系數(shù)據(jù)庫(kù)示例
- PostgreSQL的dblink擴(kuò)展模塊使用
- PostgreSQL中pageinspect 的擴(kuò)展使用小結(jié)
- PostgreSQL的擴(kuò)展adminpack使用
- PostgreSQL的擴(kuò)展 dblink及安裝使用方法
- PostgreSQL的擴(kuò)展dict_int應(yīng)用案例解析
- PostgreSQL擴(kuò)展bloom的具體使用
相關(guān)文章
在PostgreSQL中實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)清理和過(guò)期清理
在 PostgreSQL 中,可以通過(guò)多種方式實(shí)現(xiàn)數(shù)據(jù)的自動(dòng)清理和過(guò)期處理,以確保數(shù)據(jù)庫(kù)不會(huì)因?yàn)榇鎯?chǔ)過(guò)多過(guò)時(shí)或不再需要的數(shù)據(jù)而導(dǎo)致性能下降和存儲(chǔ)空間浪費(fèi),本文給大家介紹了一些常見(jiàn)的方法及詳細(xì)示例,需要的朋友可以參考下2024-07-07
postgresql 如何關(guān)閉自動(dòng)提交
這篇文章主要介紹了postgresql 如何關(guān)閉自動(dòng)提交的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
PostgreSQL因大量并發(fā)插入導(dǎo)致的主鍵沖突的解決方案
在數(shù)據(jù)庫(kù)操作中,并發(fā)插入是一個(gè)常見(jiàn)的場(chǎng)景,然而,當(dāng)大量并發(fā)插入操作同時(shí)進(jìn)行時(shí),可能會(huì)遇到主鍵沖突的問(wèn)題,本文將深入探討 PostgreSQL 中解決因大量并發(fā)插入導(dǎo)致的主鍵沖突的方法,并通過(guò)具體的示例進(jìn)行詳細(xì)說(shuō)明,需要的朋友可以參考下2024-07-07
PostgreSQL擴(kuò)展UUID-OSSP的使用方法
UUID-OSSP是PostgreSQL提供的一個(gè)擴(kuò)展模塊,用于生成符合標(biāo)準(zhǔn)的 UUID,下面就來(lái)介紹一下PostgreSQL擴(kuò)展UUID-OSSP的使用方法,具有一定的參考價(jià)值,感興趣的可以了解一下2025-07-07
PostgreSQL JOIN 聯(lián)表查詢實(shí)戰(zhàn)演練(內(nèi)連接 / 外連接
本文介紹了PostgreSQL中的JOIN查詢,包括INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN和CROSS JOIN,通過(guò)實(shí)際示例和Java代碼,展示了如何在Java應(yīng)用程序中執(zhí)行這些JOIN操作,感興趣的朋友跟隨小編一起看看吧2026-03-03
PostgreSQL通過(guò)oracle_fdw訪問(wèn)Oracle數(shù)據(jù)的實(shí)現(xiàn)步驟
通過(guò)類(lèi)似于Oracle數(shù)據(jù)庫(kù)DBLINK的方式去實(shí)現(xiàn)PostgreSQL訪問(wèn)oracle數(shù)據(jù)庫(kù),本地搭建測(cè)試環(huán)境并配置相關(guān)配置,接下來(lái)通過(guò)本文給大家分享PostgreSQL通過(guò)oracle_fdw訪問(wèn)Oracle數(shù)據(jù)的實(shí)現(xiàn)步驟,感興趣的朋友一起看看吧2021-05-05
Mybatis調(diào)用PostgreSQL存儲(chǔ)過(guò)程實(shí)現(xiàn)數(shù)組入?yún)鬟f
這篇文章主要介紹了mybatis調(diào)用postgresql自定義函數(shù)傳遞數(shù)組參數(shù)的解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
PostgreSQL如何查詢表結(jié)構(gòu)和索引信息
文章介紹了在PostgreSQL中查詢表結(jié)構(gòu)和索引信息的幾種方法,包括使用`\d`元命令、系統(tǒng)數(shù)據(jù)字典查詢以及使用可視化工具DBeaver2024-12-12
postgresql數(shù)據(jù)庫(kù)表ID自增的實(shí)現(xiàn)代碼
postgresql數(shù)據(jù)庫(kù)可以創(chuàng)建主鍵,但是沒(méi)有像mysql那樣直接指定主鍵自增的auto_increment關(guān)鍵字,因此如果在postgresql中創(chuàng)建表指定主鍵自增使用auto_increment會(huì)報(bào)錯(cuò),本文通過(guò)一個(gè)實(shí)例給大家演示自增ID的實(shí)現(xiàn),需要的朋友可以參考下2023-12-12
RockyLinux9.5部署PostgreSQL的實(shí)現(xiàn)步驟
本文主要介紹兩種部署方式,一直接部署在 linux 服務(wù)器上,二先安裝 docker,然后通過(guò) docker 部署,具有一定的參考價(jià)值,感興趣的可以了解一下2025-11-11

