当前位置: 首页 > article >正文

PostgreSQL的扩展 insert_username

PostgreSQL的扩展 insert_username

insert_username 是 PostgreSQL 的一个实用扩展,用于自动记录数据行的创建者和最后修改者信息。这个扩展特别适合需要审计跟踪的应用场景。

一 扩展安装与启用

1.1 安装扩展

-- 使用超级用户安装
CREATE EXTENSION insert_username;

1.2 验证安装

-- 查看已安装扩展
SELECT * FROM pg_available_extensions WHERE name = 'insert_username';-- 查看扩展提供的函数
\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 functionsSchema | Name | Result data type | Argument data types | Type | Volatility | Parallel | Owner | Security | Access privileges | Language | Internal name | D
escription 
--------+------+------------------+---------------------+------+------------+----------+-------+----------+-------------------+----------+---------------+--
-----------
(0 rows)white=# 

二 基本功能与使用

2.1 核心功能

该扩展提供两个主要功能:

  • 自动插入当前用户名到指定列(记录创建者)
  • 自动更新当前用户名到指定列(记录最后修改者)

2.2 基本用法示例

-- 创建测试表
CREATE TABLE documents (id serial PRIMARY KEY,content text,created_by text,  -- 记录创建者modified_by text  -- 记录最后修改者
);-- 为表添加触发器
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.documentsTable "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 自定义列名

-- 创建使用不同列名的表
CREATE TABLE projects (id serial PRIMARY KEY,name text,creator text,      -- 替代 created_bylast_editor text   -- 替代 modified_by
);-- 使用参数指定列名
CREATE TRIGGER track_project_users
BEFORE INSERT OR UPDATE ON projects
FOR EACH ROW EXECUTE FUNCTION insert_username('creator', 'last_editor');

3.2 选择性应用

-- 只跟踪创建者
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');

四 扩展内部原理

4.1 实现机制

insert_username 扩展实际上创建了一个触发器函数,该函数:

  1. 在 INSERT 操作时设置 created_by 列为当前用户名
  2. 在 UPDATE 操作时设置 modified_by 列为当前用户名

4.2 使用的PostgreSQL特性

  • 触发器函数
  • current_user 系统函数
  • 可变参数处理

五 性能考虑

5.1 性能影响

  • 触发器增加的开销通常很小
  • 每行操作增加少量CPU时间
  • 不影响查询性能,只影响DML操作

5.2 优化建议

-- 对大表考虑禁用触发器进行批量操作
ALTER TABLE large_table DISABLE TRIGGER track_large_table_users;-- 批量更新操作
UPDATE large_table SET ...;-- 重新启用触发器
ALTER TABLE large_table ENABLE TRIGGER track_large_table_users;

六 与其他扩展的对比

特性insert_usernametemporal_tablespg_audit
用户跟踪
时间跟踪
完整审计
使用复杂度简单中等复杂
性能影响

七 最佳实践

  1. 命名一致性:在所有表中使用相同的列名(如created_by/modified_by)
  2. 组合使用:与时间戳触发器结合使用
  3. 权限控制
    -- 防止手动修改跟踪列
    REVOKE UPDATE ON created_by FROM public;
    
  4. 文档记录:在数据库文档中记录审计策略
  5. 异常处理:考虑添加错误处理逻辑

八 限制与注意事项

  1. 不记录超级用户的更改(如postgres用户)
  2. 需要触发器权限才能创建相关触发器
  3. 不会跟踪DELETE操作
  4. 在多语句事务中,用户名是事务开始时的用户

insert_username扩展提供了轻量级、简单易用的用户变更跟踪功能,非常适合基本的审计需求,但对于复杂的审计场景可能需要更全面的解决方案。

相关文章:

PostgreSQL的扩展 insert_username

PostgreSQL的扩展 insert_username insert_username 是 PostgreSQL 的一个实用扩展,用于自动记录数据行的创建者和最后修改者信息。这个扩展特别适合需要审计跟踪的应用场景。 一 扩展安装与启用 1.1 安装扩展 -- 使用超级用户安装 CREATE EXTENSION insert_use…...

【机器学习基础】机器学习入门核心算法:层次聚类算法(AGNES算法和 DIANA算法)

机器学习入门核心算法:层次聚类算法(AGNES算法和 DIANA算法) 一、算法逻辑二、算法原理与数学推导1. 距离度量2. 簇间距离计算(连接标准)3. 算法伪代码(凝聚式) 三、模型评估1. 内部评估指标2. …...

Google Play的最新安全变更可能会让一些高级用户无法使用App

喜欢Root或刷机的Android用户要注意了,Google最近全面启用了新版Play Integrity API,可能会导致部分用户面临无法使用某些App的窘境。Play Integrity API是Google提供给开发者的工具,用于验证App是否在“未修改”的设备上运行。 许多重要应用…...

深度学习篇---人脸识别中的face-recognition库和深度学习

深度学习方法和使用 Python 的face_recognition库进行人脸识别在技术原理、实现方式和应用场景上有显著区别,以下从多个维度对比分析: 一、技术原理 1. 深度学习方法 核心逻辑:基于神经网络(如卷积神经网络 CNN)构建…...

(11)java+ selenium->元素定位之By_tag_name

1.简介 继续WebDriver关于元素定位,这篇介绍By ClassName。tagName是DOM结构的一部分,其中页面上的每个元素都是通过输入标签,按钮标签或锚定标签等标签定义的。每个标签都具有多个属性,例如ID,名称,值类等。就其他定位符而言在Selenium中,我们使用了标签的这些属性值来…...

React---day5

4、React的组件化 组件的分类: 根据组件的定义方式,可以分为:函数组件(Functional Component )和类组件(Class Component);根据组件内部是否有状态需要维护,可以分成:无状态组件(Stateless Component )和…...

Java开发之定时器学习

面试 一、线程池实现定时器 核心代码: public static void main(String[] args) {ScheduledExecutorService scheduledExecutorService Executors.newScheduledThreadPool(5);Runnable runnable () -> System.out.println("当前线程"Thread.current…...

HealthBench医疗AI评估基准:技术路径与核心价值深度分析(上)

引言:医疗AI评估的新范式 在人工智能技术迅猛发展的当下,医疗AI系统已逐渐从实验室走向临床应用。然而,医疗领域的特殊性要求这些系统不仅需要在技术指标上表现出色,更需要在实际临床场景中展现出可靠、安全且有效的性能。长期以来,医疗AI评估领域面临着三个核心挑战:评…...

Windows+VSCode搭建小智(xiaozhi)开发环境

作为一名DIY达人,肯定不会错过最近很火的“小智AI聊天机器人”,网上教程非常丰富,初级玩家可以直接在乐鑫官方下载ESP-IDF安装包并经过简单的菜单式配置后,即可进行代码编译和烧录(详见:Docs)。…...

VueScan Pro v9.8.45.08 一款图像扫描软件,中文绿色便携版

VueScan是著名的第三方底片扫描仪驱动程序,支持市场可见绝大多数型号的底片扫描仪,可以更为灵活地控制扫描过程,更深入地发掘硬件潜力,获取色彩 完美的高质量扫描结果。VueScan支持200种以上的底片类型,在剪取图像时制…...

FreeRTOS通俗理解指南:基础概念 + 架构+ 内核组件+练手实验

RTOS 基础概念 想象一下,你是一个忙碌的厨师,在厨房里同时要完成煎牛排和煮意大利面两项任务。 1.传统单线程模式(没有RTOS) 如果你只能按顺序一项一项地做,就会是这样的过程: 先煎一会儿牛排然后去看看…...

Python后端开发实战:从0到1搭建高可用API服务

引言 Python凭借其简洁的语法和丰富的生态(如Django、Flask、FastAPI等框架),已成为后端开发的主流语言之一。本文将结合一个真实电商API项目,分享从架构设计到部署上线的完整流程,并总结开发过程中常见的坑与最佳实践。 一、实战案例:电商API开发流程 1.1 技术选型 框…...

房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块

房屋租赁系统 JavaVue.jsSpringBoot,包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块 百度云盘链接:https://pan.baidu.com/s/16YRGBPsfbd4_HxXhO0jM5Q 密码:smk4 摘 要 房屋是人类生活栖息的重要…...

4、ubuntu系统 | 文本和目录操作函数

1、目录操作函数 ls(列出目录内容) 用途:列出指定目录中的文件和子目录。语法:ls [选项] [路径]常用选项: -l:以长格式显示文件详细信息(权限、所有者、大小、时间等)。-a&#xff…...

docker部署ELK,ES开启安全认证

ES启动命令 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:8.17.0 es启动之后需要进入es容器,重置密码 elasticsearch-reset-password -u elastic -i 重置后的密码配置到kibana.yml中,启动kibana docker run …...

ASP.NET MVC添加视图示例

ASP.NET MVC高效构建Web应用- 商品搜索 - 京东 视图(V)是一个动态生成HTML页面的模板,它负责通过用户界面展示内容。本节将修改HelloWorldController类,并使用视图模板文件,以干净地封装生成对客户端的HTML响应的过程…...

自动驾驶中的路径跟踪:Python实现与技术解析

自动驾驶中的路径跟踪:Python实现与技术解析 一、路径跟踪是什么?为什么它至关重要? 路径跟踪(Path Tracking)是自动驾驶系统的关键部分之一,它负责确保车辆能够沿着预定义的轨迹行驶,同时稳定控制转向角度和速度。一个好的路径跟踪算法需要具备以下特点: 精准度:能…...

前端面试题目-高频问题集合

1.CSS里面水平垂直居中的方法 1.CSS里面水平垂直居中的方法弹性布局display: flex; /*先开启flex布局*/justify-content: center; /*实现水平居中*/jalign-items: center; /*实现垂直居中*/网格布局display: grid; /*先开启grid布局*/plac…...

MyBatis源码解析:从 Mapper 接口到 SQL 执行的完整链路

MyBatis源码解析:从 Mapper 接口到 SQL 执行的完整链路 一、Mapper 代理对象的创建:sqlSession.getMapper(UserMapper.class)二、接口方法的执行:mapper.selectUser("coderzpw", 18)2.1 四大核心组件解析2.1.1 Executor&#xff08…...

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Form Wave(表单label波动效果)

📅 我们继续 50 个小项目挑战!—— FormWave组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ 🎯 组件目标 构建一个美观、动态的登录表单&#xff0…...

双目相机深度的误差分析(基线长度和相机焦距的选择)

全文基于针孔模型和基线水平放置来讨论 影响双目计算深度的因素: 1、基线长度:两台相机光心之间距离2、相机焦距(像素): f x f_x fx​(或 f y f_y fy​)为焦距 f f f和一个缩放比例的乘积。在…...

Pytorch Geometric官方例程pytorch_geometric/examples/link_pred.py环境安装教程及图数据集制作

最近需要训练图卷积神经网络(Graph Convolution Neural Network, GCNN),在配置GCNN环境上总结了一些经验。 我觉得对于初学者而言,图神经网络的训练会有2个难点: ①环境配置 ②数据集制作 一、环境配置 我最初光想…...

React---day6、7

6、组件之间进行数据传递 **6.1 父传子&#xff1a;**props传递属性 父组件&#xff1a; <div><ChildCpn name"蒋乙菥" age"18" height"1,88" /> </div>子组件&#xff1a; export class ChildCpn extends React.Component…...

hook组件-useEffect、useRef

hook组件-useEffect、useRef useEffect 用法及执行机制 WillMount -> render -> DidMount ShouldUpdate -> WillUpdate -> render -> DidUpdate WillUnmount(只有这个安全) WillReceiveProps useEffect(callback) 默认所有依赖都更新useEffect(callback, [])&am…...

功能结构整理

C# Sxer Sxer.Base&#xff1a;基础子功能 Sxer.Base.Debug&#xff1a;打印 Sxer.Utility&#xff1a;工具类 Sxer.CustomFunction&#xff1a;独立功能点开发 Unity...

企业级开发中的 maven-mvnd 应用实践

1. 引言:Maven 在企业级开发中的挑战 1.1 Maven 构建的常见痛点 在大型 Java 项目中,Maven 是主流的构建工具,但随着项目的复杂度增加,其性能瓶颈逐渐显现: 构建速度慢:每次执行 mvn clean install 都需要重新加载插件和依赖。重复构建浪费资源:即使未修改源码,仍会触…...

yolov12毕设前置知识准备 1

1 什么是目标检测呢&#xff1f; 目标检测&#xff08;Object Detection&#xff09;主要用于识别图像或视频中特定类型物体的位置&#xff0c;并标注其类别。 简单来说&#xff0c;就是让计算机像人类一样 “看懂” 图像内容&#xff0c;不仅能识别出物体&#xff08;如人、…...

随机游动算法解决kSAT问题

input&#xff1a;n个变量的k-CNF公式 ouput&#xff1a;该公式的一组满足赋值或宣布没有满足赋值 算法步骤&#xff1a; 随机均匀地初始化赋值 a ∈ { 0 , 1 } n a\in\{0,1\}^n a∈{0,1}n.重复t次&#xff08;后面会估计这个t&#xff09;&#xff1a; a. 如果在当前赋值下…...

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡 第一节 从康盛创想到腾讯收购&#xff1a;PC时代的辉煌 1.1 Discuz! 的诞生&#xff1a;康盛创想的开源梦想 2001年&#xff0c;中国互联网正处于萌芽阶段&#xff0c;个人网站和论坛开始兴起。…...

azure web app创建分步指南系列之一

什么是 Azure Web 应用? Azure Web 应用是 Azure 应用服务的一部分,是一个完全托管的平台,用于开发、部署和扩展 Web 应用程序。它支持各种编程语言和框架,例如 .NET、Java、Python、PHP 和 Node.js,使开发人员能够构建强大的 Web 应用程序,而无需担心底层基础架构。借助…...