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用户名:
- 配置
pg_hba.conf添加SSPI认证规则,示例:host all all 127.0.0.1/32 sspi - 客户端使用集成认证连接(比如psql命令:
psql -U sspi -d your_database,或图形工具选择Windows身份验证) - 查询当前会话的客户端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用户名:
- 客户端连接时设置会话参数(以psql为例):
应用程序中可在连接字符串里添加psql -d your_database -U db_user -c "SET application_name = '$(whoami)'"application_name参数,值为当前Windows用户名。 - 在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
相关产品推荐
相关产品推荐

