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

PostgreSQL中替代Oracle Sys_context获取Windows登录用户名的方法

在PostgreSQL中获取Windows登录用户名(替代Oracle的Sys_context('USERENV', 'OS_USER'))

PostgreSQL本身没有像Oracle Sys_context('USERENV', 'OS_USER')那样直接获取客户端Windows用户名的内置函数,需要根据连接方式采用不同方案:

方案1:通过Windows集成身份验证(SSPI)获取

如果你的PostgreSQL服务配置了Windows集成认证,客户端用该方式连接时,服务端可以获取到客户端的Windows用户名:

  1. 配置pg_hba.conf添加SSPI认证规则,示例:
    host    all             all             127.0.0.1/32            sspi
    
  2. 客户端使用集成认证连接(比如psql命令:psql -U sspi -d your_database,或图形工具选择Windows身份验证)
  3. 查询当前会话的客户端Windows用户名:
    -- 获取映射后的数据库用户名(需在pg_ident.conf中配置映射规则)
    SELECT usename
    FROM pg_stat_activity
    WHERE pid = pg_backend_pid();
    
    -- 部分PostgreSQL版本支持直接获取原始Windows用户名
    SELECT current_setting('pgwin32.sspi_username');
    

方案2:客户端主动传递Windows用户名

若无法使用集成认证,可让客户端在连接时主动传递Windows用户名:

  1. 客户端连接时设置会话参数(以psql为例):
    psql -d your_database -U db_user -c "SET application_name = '$(whoami)'"
    
    应用程序中可在连接字符串里添加application_name参数,值为当前Windows用户名。
  2. 在PostgreSQL中获取该参数:
    SELECT current_setting('application_name');
    
    也可以封装成自定义函数:
    CREATE OR REPLACE FUNCTION get_os_user()
    RETURNS text AS $$
    BEGIN
        RETURN current_setting('application_name');
    END;
    $$ LANGUAGE plpgsql;
    
    -- 使用函数
    SELECT get_os_user();
    

说明

你之前执行的SELECT usename FROM pg_user;、SELECT user;等语句,获取的是数据库层面的用户名,和客户端的Windows操作系统用户名属于不同范畴,因此无法得到你需要的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:55:32