PostgreSQL 17新特性之登录事件触发器

news/2024/7/9 19:41:47 标签: postgresql, 数据库, 触发器

PostgreSQL 9.3 就提供了事件触发器功能,可以基于 DDL 语句触发相应的操作。

正在开发中的 PostgreSQL 17 增加了基于登录事件的触发器,可以在用户登录时执行某些检查或者特定操作。登录事件触发器的使用方法和其他触发器一样:创建一个返回 event_trigger 的函数,然后基于 login 事件创建一个事件触发器

例如,以下函数返回了一个 event_trigger 对象:

CREATE OR REPLACE FUNCTION login_validate() 
RETURNS event_trigger
LANGUAGE plpgsql 
AS $$
DECLARE
BEGIN
    IF session_user <> 'postgres' and current_time not between '09:00:00' and '18:00:00' THEN
        raise exception '非工作时间只允许超级用户postgres登录!';
    END IF;
    raise log '用户登录成功:%', session_user;
END;
$$;

然后创建一个登录事件触发器

CREATE EVENT TRIGGER login_validate
  ON login
  EXECUTE FUNCTION login_validate();

使用 postgres 用户可以正常登录:

psql -U postgres -W -d testdb -X -c 'select 1'

?column?|
--------+
       1|

此时,我们可以在日志文件中看到以下信息:

2023-10-25 21:44:37.949 CST [8308] 日志: 用户登录:postgres
2023-10-25 21:44:37.949 CST [8308] 上下文: PL/pgSQL function login_validate() line 7 at RAISE
2023-10-25 21:44:37.949 CST [8308] 日志:  duration: 0.200 ms  statement: select 1

如果使用其他账号登录:

psql -U tony -d -W testdb -X -c 'select 1'
psql: error: connection TO server ON socket "/tmp/.s.PGSQL.5432" failed: FATAL:  非工作时间只允许超级用户postgres登录!
CONTEXT:  PL/pgSQL FUNCTION login_validate() line 5 at RAISE

同时,日志文件也会打印类似信息。

除了禁止登录之外,我们也可以记录所有用户登录信息,用于审计。

为了避免数据库没有登录触发器时不必要的时间消耗,同时增加了一个 pg_database.dathasloginevt 标识,记录数据库是否存在有效的登录触发器。当我们执行 CREATE/ALTER EVENT TRIGGER 语句时会设置这个标识,连接时如果没有发现有效的登录触发器就取消设置。


http://www.niftyadmin.cn/n/5122316.html

相关文章

解决问题:Expected one result (or null) to be returned by selectOne(),but found: 2]

在做一次数据迁移后&#xff0c;系统登录失败&#xff0c;日志报错&#xff1a; 原因&#xff1a;在数据迁移账号时&#xff0c;用户账号有两个相同的账号&#xff0c;所以导致登录失败。

淘宝商品详情API接口,解决滑块问题

淘宝商品详情API接口是一种用于获取淘宝商品详细信息的接口&#xff0c;它可以帮助开发者在自己的网站或应用程序中快速获取淘宝商品的详细信息&#xff0c;包括价格、图片、商品描述等。 该接口的主要作用包括&#xff1a; 商品信息展示&#xff1a;通过淘宝商品详情API接口…

【算法练习Day28】 K 次取反后最大化的数组和加油站分发糖果

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 K 次取反后最大化的数组和加…

网络问题进行排查、定位

网络问题的排查和定位可以按照以下步骤进行&#xff1a; 1. 确定问题范围&#xff1a;首先需要明确问题是局部还是整个网络受影响&#xff0c;可以通过其他设备或用户是否能够正常访问网络来判断。 2. 检查硬件连接&#xff1a;检查网络设备&#xff08;如路由器、交换机&…

【Linux】CentOS8.4 安装docker

&#x1f984; &#x1f390;个人主页 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; 感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01;&#x1fa81;&#x1f341;&#x1fa81;&…

福建三明大型工程机械3D扫描测量工程零件开模加工逆向抄数-CASAIM中科广电

高精度3D扫描测量技术已经在大型工件制造领域发挥着重要作用&#xff0c;可以高精度高效率实现全尺寸三维测量&#xff0c;本期&#xff0c;CASAIM要分享的应用是大型工程机械3D扫描测量案例。 铣轮是深基础施工领域内工法先进、技术复杂程度高、高附加值的地连墙设备&#xff…

【性能测试】MySQL慢查询原因/排查思路+SQL优化与性能定位思路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Mysql慢查询现象、…

Go基础——基础语法

1、简介 Go&#xff08;又称Golang&#xff09;是Google开发的一种静态强类型、编译型、并发型&#xff0c;并具有垃圾回收功能的编程语言。语法类似于C&#xff0c;专为高性能和并发程序而设计。通常用于网络编程、云服务器、游戏服务器、DevOps、Web应用、分布式系统、容器虚…