PostgreSQL中insert_username的擴展使用
insert_username
是 PostgreSQL 的一個實用擴展,用于自動記錄數(shù)據(jù)行的創(chuàng)建者和最后修改者信息。這個擴展特別適合需要審計跟蹤的應(yīng)用場景。
一 擴展安裝與啟用
1.1 安裝擴展
-- 使用超級用戶安裝 CREATE EXTENSION insert_username;
1.2 驗證安裝
-- 查看已安裝擴展 SELECT * FROM pg_available_extensions WHERE name = 'insert_username'; -- 查看擴展提供的函數(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 核心功能
該擴展提供兩個主要功能:
- 自動插入當(dāng)前用戶名到指定列(記錄創(chuàng)建者)
- 自動更新當(dāng)前用戶名到指定列(記錄最后修改者)
2.2 基本用法示例
-- 創(chuàng)建測試表 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()
三 高級配置選項
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');
四 擴展內(nèi)部原理
4.1 實現(xiàn)機制
insert_username
擴展實際上創(chuàng)建了一個觸發(fā)器函數(shù),該函數(shù):
- 在 INSERT 操作時設(shè)置
created_by
列為當(dāng)前用戶名 - 在 UPDATE 操作時設(shè)置
modified_by
列為當(dāng)前用戶名
4.2 使用的PostgreSQL特性
- 觸發(fā)器函數(shù)
current_user
系統(tǒng)函數(shù)- 可變參數(shù)處理
五 性能考慮
5.1 性能影響
- 觸發(fā)器增加的開銷通常很小
- 每行操作增加少量CPU時間
- 不影響查詢性能,只影響DML操作
5.2 優(yōu)化建議
-- 對大表考慮禁用觸發(fā)器進行批量操作 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;
六 與其他擴展的對比
特性 | insert_username | temporal_tables | pg_audit |
---|---|---|---|
用戶跟蹤 | ? | ? | ? |
時間跟蹤 | ? | ? | ? |
完整審計 | ? | ? | ? |
使用復(fù)雜度 | 簡單 | 中等 | 復(fù)雜 |
性能影響 | 低 | 中 | 高 |
七 最佳實踐
命名一致性:在所有表中使用相同的列名(如created_by/modified_by)
組合使用:與時間戳觸發(fā)器結(jié)合使用
權(quán)限控制:
-- 防止手動修改跟蹤列 REVOKE UPDATE ON created_by FROM public;
文檔記錄:在數(shù)據(jù)庫文檔中記錄審計策略
異常處理:考慮添加錯誤處理邏輯
八 限制與注意事項
- 不記錄超級用戶的更改(如postgres用戶)
- 需要觸發(fā)器權(quán)限才能創(chuàng)建相關(guān)觸發(fā)器
- 不會跟蹤DELETE操作
- 在多語句事務(wù)中,用戶名是事務(wù)開始時的用戶
insert_username
擴展提供了輕量級、簡單易用的用戶變更跟蹤功能,非常適合基本的審計需求,但對于復(fù)雜的審計場景可能需要更全面的解決方案。
到此這篇關(guān)于PostgreSQL中insert_username的擴展的文章就介紹到這了,更多相關(guān)PostgreSQL insert_username擴展內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Debian中PostgreSQL數(shù)據(jù)庫安裝配置實例
這篇文章主要介紹了Debian中PostgreSQL數(shù)據(jù)庫安裝配置實例,一個簡明教程,需要的朋友可以參考下2014-06-06postgresql 利用fdw來實現(xiàn)不同數(shù)據(jù)庫之間數(shù)據(jù)互通(推薦)
這篇文章主要介紹了postgresql 利用fdw來實現(xiàn)不同數(shù)據(jù)庫之間數(shù)據(jù)互通,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02postgresql 實現(xiàn)replace into功能的代碼
這篇文章主要介紹了postgresql 實現(xiàn)replace into功能的代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01PostgreSQL ROW_NUMBER() OVER()的用法說明
這篇文章主要介紹了PostgreSQL ROW_NUMBER() OVER()的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Postgresql 數(shù)據(jù)庫轉(zhuǎn)義字符操作
這篇文章主要介紹了Postgresql 數(shù)據(jù)庫轉(zhuǎn)義字符操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01詳解PostgreSql數(shù)據(jù)庫對象信息及應(yīng)用
這篇文章主要介紹了PostgreSql數(shù)據(jù)庫對象信息及應(yīng)用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12PostgreSQL教程(七):函數(shù)和操作符詳解(3)
這篇文章主要介紹了PostgreSQL教程(七):函數(shù)和操作符詳解(3),本文講解了序列操作函數(shù)、條件表達式、數(shù)組函數(shù)和操作符、系統(tǒng)信息函數(shù)、系統(tǒng)管理函數(shù)等內(nèi)容,需要的朋友可以參考下2015-05-05