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

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

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

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

sql 复制代码
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;
$$;

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

sql 复制代码
CREATE EVENT TRIGGER login_validate
  ON login
  EXECUTE FUNCTION login_validate();

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

bash 复制代码
psql -U postgres -W -d testdb -X -c 'select 1'

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

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

bash 复制代码
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

如果使用其他账号登录:

bash 复制代码
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 语句时会设置这个标识,连接时如果没有发现有效的登录触发器就取消设置。

相关推荐
DashVector5 分钟前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索
KYGALYX1 小时前
在Linux中备份msyql数据库和表的详细操作
linux·运维·数据库
檀越剑指大厂1 小时前
金仓KReplay:定义数据库平滑迁移新标准
数据库
努力成为一个程序猿.1 小时前
【Flink】FlinkSQL-动态表和持续查询概念
大数据·数据库·flink
毕设十刻2 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
liliangcsdn3 小时前
如何利用约束提示优化LLM在问题转sql的一致性
数据库·sql
Java爱好狂.4 小时前
分布式ID|从源码角度深度解析美团Leaf双Buffer优化方案
java·数据库·分布式·分布式id·es·java面试·java程序员
Elastic 中国社区官方博客4 小时前
通过混合搜索重排序提升多语言嵌入模型的相关性
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
倔强的石头1064 小时前
KingbaseES:从兼容到超越,详解超越MySQL的权限隔离与安全增强
数据库·mysql·安全·金仓数据库
小鸡毛程序员5 小时前
我在CSDN学MYSQL之----数据库基本概念和基本知识(下)
数据库·mysql