login_hook

在用户登陆时执行login_hook.login()函数

概览

扩展包名版本分类许可证语言
login_hook1.7SECGPL-3.0C
ID扩展名BinLibLoadCreateTrustReloc模式
7360login_hooklogin_hook
相关扩展pg_auth_mon credcheck set_user pg_permissions passwordcheck_cracklib pgaudit auth_delay passwordcheck

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.71817161514login_hook-
RPMPGDG1.71817161514login_hook_$v-
DEBPIGSTY1.71817161514postgresql-$v-login-hook-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
d13.x86_64
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
d13.aarch64
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
u22.x86_64
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
u22.aarch64
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
u24.x86_64
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
u24.aarch64
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7
PIGSTY 1.7

构建

您可以使用 pig build 命令构建 login_hook 扩展的 RPM / DEB 包:

pig build pkg login_hook         # 构建 RPM / DEB 包

安装

您可以直接安装 login_hook 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install login_hook;          # 当前活跃 PG 版本安装
pig ext install -y login_hook -v 18  # PG 18
pig ext install -y login_hook -v 17  # PG 17
pig ext install -y login_hook -v 16  # PG 16
pig ext install -y login_hook -v 15  # PG 15
pig ext install -y login_hook -v 14  # PG 14
dnf install -y login_hook_18       # PG 18
dnf install -y login_hook_17       # PG 17
dnf install -y login_hook_16       # PG 16
dnf install -y login_hook_15       # PG 15
dnf install -y login_hook_14       # PG 14
apt install -y postgresql-18-login-hook   # PG 18
apt install -y postgresql-17-login-hook   # PG 17
apt install -y postgresql-16-login-hook   # PG 16
apt install -y postgresql-15-login-hook   # PG 15
apt install -y postgresql-14-login-hook   # PG 14

创建扩展

CREATE EXTENSION login_hook;

用法

login_hook: 在用户登录时执行代码,类似于 Oracle 的 after logon 触发器

login_hook 允许在用户登录数据库时执行自定义 PL/pgSQL 代码。

CREATE EXTENSION login_hook;

配置

添加到 postgresql.conf

session_preload_libraries = 'login_hook'

创建登录函数

定义一个 login_hook.login() 函数,该函数将在每次登录时执行:

CREATE OR REPLACE FUNCTION login_hook.login() RETURNS VOID LANGUAGE PLPGSQL AS $$
BEGIN
    IF NOT login_hook.is_executing_login_hook() THEN
        RAISE EXCEPTION 'Should only be invoked by login_hook';
    END IF;

    -- 你的登录逻辑:
    RAISE NOTICE 'Hello %', current_user;

EXCEPTION
    WHEN OTHERS THEN
        RAISE LOG 'Error in login_hook.login(): %', SQLERRM;
END
$$;
GRANT EXECUTE ON FUNCTION login_hook.login() TO PUBLIC;

需要 PUBLIC 授权,因为该函数会为每个连接用户运行。

函数

函数返回类型描述
login_hook.is_executing_login_hook()boolean仅在登录钩子执行期间调用时返回 true
login_hook.get_login_hook_version()text返回 login_hook 的编译版本
login_hook.login()void用户提供的在登录时执行的函数

重要说明

  • 该函数不会在后台进程或恢复模式期间被调用
  • 在函数内部处理所有异常 —— 失败将阻止普通用户登录
  • 超级用户在函数失败时会收到警告但仍可登录
  • 对于 PostgreSQL 17+,可考虑使用原生登录事件触发器

最后修改 2026-03-14: update extension metadata (953cbd0)