You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL登录时执行脚本:按用户与应用名设置会话超时

PostgreSQL实现登录时的会话超时配置方案

PostgreSQL没有专门的“登录脚本存放目录”,但可以通过以下两种方式实现你需要的逻辑:

方式一:会话启动事件触发器(全局生效)

1. 编写触发函数

创建一个函数,检查当前登录用户和application_name,符合条件则设置超时参数:

CREATE OR REPLACE FUNCTION set_session_timeout_on_login()
RETURNS event_trigger
LANGUAGE plpgsql
AS $$
BEGIN
    -- 替换为你的目标用户名和app name关键词
    IF current_user = '指定用户名' AND current_setting('application_name') LIKE '%指定值%' THEN
        EXECUTE 'SET idle_in_transaction_session_timeout = ''5min'';'; -- 替换为需要的超时时间
    END IF;
END;
$$;

2. 创建会话启动触发器

将函数绑定到session_start事件,每次用户建立会话时自动执行:

CREATE EVENT TRIGGER set_timeout_trigger
ON session_start
EXECUTE FUNCTION set_session_timeout_on_login();

注意

  • 仅超级用户有权限创建事件触发器,执行命令需拥有SUPERUSER权限。
  • 若需适配多个用户,可修改current_user判断为current_user IN ('用户1', '用户2')。
  • 确保客户端连接时正确传递application_name参数,否则判断逻辑不生效。

方式二:用户级参数绑定函数(轻量适配)

如果只需针对特定用户生效,可通过绑定动态函数实现:

1. 编写动态返回超时值的函数

CREATE OR REPLACE FUNCTION get_idle_timeout()
RETURNS interval
LANGUAGE plpgsql
STABLE
AS $$
BEGIN
    IF current_setting('application_name') LIKE '%指定值%' THEN
        RETURN '5min'::interval;
    ELSE
        -- 不符合条件时使用全局默认值
        RETURN current_setting('idle_in_transaction_session_timeout')::interval;
    END IF;
END;
$$;

2. 给目标用户绑定参数

ALTER ROLE 指定用户名 SET idle_in_transaction_session_timeout = get_idle_timeout();

这种方式无需触发器,仅对目标用户生效,更轻量化。

补充说明

PostgreSQL不存在传统的登录脚本存放位置,所有会话初始化逻辑均通过事件触发器或用户级参数绑定函数实现,这两种是官方推荐的自定义会话初始化方案。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:20:32