PostgreSQL实现USERENV函数(兼容oracle)
oracle中使用USERENV 函数来获取当前会话变量的函数,支持的参数有:
CLINET_INFO | 返回最高可达64个字节存储的用户会话信息,可由应用程序使用DBMS_APPLICATION_INFO包。 |
---|---|
ENTRYID | 返回当前审计条目编号。审计的EntryID序列细粒度的审计记录和定期审计记录之间共享。在分布式SQL语句不能使用这个属性。 |
ISDBA | 如果用户已经被认证为dba;或者是通过操作系统或口令文件具有DBA特权的,返回“TRUE",否则返回"FALSE" |
LANG | 返回ISO缩写语言名称,一个比现有的“语言”参数较短的形式。 |
LANGUAGE | 返回数据库当前会话的语言、地域和字符集。 |
SESSIONID | 返回审计会话标识符。在分布式SQL语句不能指定此参数。 |
SID | 返回数据库会话ID。 |
TERMINAL | 返回当前会话的终端操作系统的标识符。在分布式SQL语句,此参数返回了标识符为本地会话。在分布式环境中,此参数只支持远程SELECT语句,不用于远程INSERT,UPDATE或DELETE操作。 |
用法如下:
SELECT USERENV('CLIENT_INFO') FROM dual; SELECT USERENV('ENTRYID') FROM dual; SELECT USERENV('ISDBA') FROM dual; -- 查看当前用户是否是DBA如果是则返回true SELECT USERENV('LANG') FROM dual; SELECT USERENV('LANGUAGE') FROM dual; SELECT USERENV('SESSIONID') FROM dual; -- 会话标志:sessionId SELECT USERENV('TERMINAL') FROM dual;
例如:
SQL> select userenv('language') from dual;USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBKSQL> select userenv('sessionid') from dual;USERENV('SESSIONID')
--------------------4294967295SQL> select userenv('isdba') from dual;USEREN
------
TRUE
显然在pg中是不支持userenv这个函数的,不过我们可以在pg中通过自定义函数来实现类似的功能。
首先我们需要先创建一个userenv函数的空壳,支持任意变量的输入。
bill@bill=>create or replace function userenv(anynonarray) returns anynonarray as $$
bill$# declare
bill$# begin
bill$# case lower($1)
bill$# when 'sessionid' then
bill$# return get_session_id();
bill$# when 'isdba' then
bill$# return get_isdba();
bill$# when 'action' then
bill$# return get_action();
bill$# when 'lang' then
bill$# return get_lang();
bill$# when 'language' then
bill$# return get_language();
bill$# else
bill$# return null;
bill$# end case;
bill$# end;
bill$# $$ language plpgsql strict;
CREATE FUNCTION
接下来我们只需要根据oracle中对应的例子去编写对应的实际函数就可以了。
例如:
1、USERENV(‘SESSIONID’)
创建:
bill@bill=>create sequence public.pg_session_id_sequence_oracle_comp;
CREATE SEQUENCEbill@bill=>grant all on sequence public.pg_session_id_sequence_oracle_comp to public;
GRANTbill@bill=>create OR replace function get_session_id() returns int8 AS $$
bill$# declare res int8;
bill$# begin
bill$# SELECT currval('public.pg_session_id_sequence_oracle_comp') into res;
bill$# return res;
bill$# exception
bill$# WHEN sqlstate '55000' THEN
bill$# SELECT nextval('public.pg_session_id_sequence_oracle_comp') into res;
bill$# return res;
bill$# WHEN sqlstate '42P01' THEN
bill$# create sequence public.pg_session_id_sequence_oracle_comp;
bill$# SELECT nextval('public.pg_session_id_sequence_oracle_comp') into res;
bill$# return res;
bill$# end;
bill$# $$ language plpgsql strict SET client_min_messages to error;
CREATE FUNCTION
使用:
bill@bill=>select userenv('sessionid'::Text); userenv
---------1
(1 row)
2、USERENV(‘ISDBA’)
创建:
bill@bill=>create OR replace function get_isdba() returns boolean AS $$
bill$# select rolsuper from pg_roles where rolname=current_user;
bill$# $$ language sql strict SET client_min_messages to error;
CREATE FUNCTION
使用:
bill@bill=>select userenv('isdba'::Text); userenv
---------true
(1 row)
3、USERENV(‘ACTION’)
创建:
bill@bill=>create OR replace function get_ACTION() returns text AS $$
bill$# select application_name from pg_stat_activity where pid=pg_backend_pid();
bill$# $$ language sql strict SET client_min_messages to error;
CREATE FUNCTION
使用:
bill@bill=>select userenv('action'::Text); userenv
---------psql
(1 row)
4、USERENV(‘LANG’)
创建:
bill@bill=>create OR replace function get_LANG() returns text AS $$
bill$# select (regexp_split_to_array(current_setting('lc_messages'), '\.'))[1];
bill$# $$ language sql strict;
CREATE FUNCTION
使用:
bill@bill=>select userenv('lang'::text); userenv
---------C
(1 row)
5、USERENV(‘LANGUAGE’)
创建:
bill@bill=>create OR replace function get_LANGUAGE() returns text AS $$
bill$# select (regexp_split_to_array(current_setting('lc_monetary'), '\.'))[1]||'.'||pg_client_encoding();
bill$# $$ language sql strict;
CREATE FUNCTION
使用:
bill@bill=>select userenv('language'::text); userenv
---------C.UTF8
(1 row)
除此之外其它的我们也可以通过这种方式添加,这样便可以兼容oracle的userenv函数了。
参考链接:
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions208.htm
PostgreSQL实现USERENV函数(兼容oracle)相关推荐
- PostgreSQL创建synonym(兼容oracle)
oracle中支持对创建别名synonym,这个功能在某些场合十分有用.例如,当我们迁移数据库的时候,如果碰到用户名冲突的情况,我们可能只好将数据迁移到其它用户下面,但是在程序中使用到数据库里对象的地 ...
- Oracle、Postgresql 中round函数的用法说明
首先我们来说下这个Oracle中的round函数 Oracle round 函数的意思是四舍五入的方法,即传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果,参数 number 是指需要 ...
- PostgreSQL 统计信息pg_statistic格式及导入导出dump_stat - 兼容Oracle
标签 PostgreSQL , dump_stat , 统计信息 , 导出导入 背景 <PostgreSQL 规格评估 - 微观.宏观.精准 多视角估算数据库性能(选型.做预算不求人)> ...
- oracle userenv(sid),ORACLE USERENV函数
ORACLE USERENV函数 USERENV返回关于当前会话的信息.此信息可以用于编写一个应用程序特定的审计跟踪表或确定特定于语言的角色目前使用的会话. 参数 功能 CLINET_INFO 返回最 ...
- oracle 临时表存在哪里_openGauss魔改PG?它能兼容Oracle的数据库表吗?
作者介绍 洪烨,openGauss Contributor,多年银行业系统架构设计及DBA实战经验,<DB2数据库内部解析与性能调优>作者. openGauss的前世今生 上一篇看到很多朋 ...
- oracle中orand使用,Postgres兼容Oracle研究——orafce调研
一.背景 PostgreSQL是和Oracle最接近的企业数据库,包括数据类型,功能,架构和语法等几个方面.甚至大多数的日常应用的性能也不会输给Oracle. 但是Oracle有些函数或者包,默认Po ...
- 什么是PostgreSQL?跟MySQL、Oracle比强在哪?
导读:本文主要给大家介绍什么是PostgreSQL数据库.PostgreSQL有哪些强大的功能及其目前的一些应用情况,以便大家对PostgreSQL有一个初步的认识. 作者:唐成 来源:大数据DT(I ...
- 提供oracle兼容特性报,【干货】K-DB为什么能全面兼容Oracle
不是每一款数据库都能全面兼容Oracle,就像不是所有数据库都可以被称之为K-DB,一般数据库能做到的SQL标准和函数上兼容Oracle,而K-DB则能实现更多,在数据库体系架构.集群方式.数据库对象 ...
- 【函数】Oracle函数系列(2)--数学函数及日期函数
[函数]Oracle函数系列(2)--数学函数及日期函数 [函数]Oracle函数系列(2)--数学函数及日期函数 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者, ...
最新文章
- VMware vSphere开发(1)安装配置VMware vSphere Web Services SDK的运行环境
- C#程序设计笔记(第九章)
- python爬虫有什么用处-python为什么叫爬虫 python有什么优势
- Poj - 3254 Corn Fields (状压DP)(入门)
- 史上最全的Linux常用命令汇总①收藏这一篇就够了!(超全,超详细)
- 工业发展 安全护航 2021年工业互联网安全发展峰会成功召开
- oracle10g备份导入
- MySQL:Specified key was too long; max key length is 1000 bytes
- 工业大数据发展面临四方面挑战
- 基于matlab的暴雨强度公式参数推求,小样本流域降雨强度公式和设计降雨分布的推求方法...
- qq音乐网络异常获取音乐失败_qq音乐网络异常获取音频失败怎么办
- 我就问你1MB和1Mb能一样吗?
- 亮度,饱和度,对比度的计算方法
- MATLAB R2018b for Mac(数学分析软件)附matlab激活密钥
- 如何在 iPhone 和 iPad 上将你的照片转换为 PDF?
- 大数据Flink面试考题___Flink高频考点,万字超全整理(建议)
- 惊天大突破!「我国数学家证明 NP=P」!道翰天琼认知智能机器人平台API接口大脑为您揭秘。
- 如果不坚持,到哪里都是放弃
- VScode受难记 - 0
- python读取部分文件_Python文件读取部分,python,篇