PostgreSQL Oracle 兼容性 之 USERENV

标签

PostgreSQL , Oracle , USERENV , 会话环境变量


背景

USERENV 是Oracle 用来获取当前会话变量的函数。官方是这么介绍的:

https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions184.htm#SQLRF06117

Describes the current session. The predefined parameters of namespace USERENV are listed in Table 5-11.

一些常见的例子:

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;
Parameter Return Value
ACTION Identifies the position in the module (application name) and is set through the DBMS_APPLICATION_INFO package or OCI.
CLIENT_INFO Returns up to 64 bytes of user session information that can be stored by an application using the DBMS_APPLICATION_INFO package.
ENTRYID The current audit entry number. The audit entryid sequence is shared between fine-grained audit records and regular audit records. You cannot use this attribute in distributed SQL statements. The correct auditing entry identifier can be seen only through an audit handler for standard or fine-grained audit.
ISDBA Returns TRUE if the user has been authenticated as having DBA privileges either through the operating system or through a password file.
LANG The abbreviated name for the language, a shorter form than the existing 'LANGUAGE' parameter.
LANGUAGE The language and territory currently used by your session, along with the database character set, in this form: language_territory.characterset
SESSIONID The auditing session identifier. You cannot use this attribute in distributed SQL statements.
TERMINAL The operating system identifier for the client of the current session. In distributed SQL statements, this attribute returns the identifier for your local session. In a distributed environment, this is supported only for remote SELECT statements, not for remote INSERT, UPDATE, or DELETE operations. (The return length of this parameter may vary by operating system.)

PostgreSQL中如何实现类似的功能呢?

1、写个壳子,支持输出任意类型。(因为前面提到的变量,返回的类型可能是时间、字符串、数字等。)

create or replace function userenv(anynonarray) returns anynonarray as $$
declare
begin
  case lower($1)
  when 'sessionid' then
    return get_session_id();
  when 'isdba' then
    return get_isdba();
  when 'action' then
    return get_action();
  else
    return null;
  end case;
end;
$$ language plpgsql strict;

然后需要写实际的函数,例如

1、USERENV('SESSIONID'):

create sequence public.pg_session_id_sequence_oracle_comp;
grant all on sequence public.pg_session_id_sequence_oracle_comp to public;  

create OR replace function get_session_id() returns int8 AS $$
declare res int8;
begin
SELECT currval('public.pg_session_id_sequence_oracle_comp') into res;
return res;
exception
    WHEN sqlstate '55000' THEN
SELECT nextval('public.pg_session_id_sequence_oracle_comp') into res;
return res;
    WHEN sqlstate '42P01' THEN
create sequence public.pg_session_id_sequence_oracle_comp;
SELECT nextval('public.pg_session_id_sequence_oracle_comp') into res;
return res;
end;
$$ language plpgsql strict SET client_min_messages to error;

2、USERENV('ISDBA')

create OR replace function get_isdba() returns boolean AS $$
  select rolsuper from pg_roles where rolname=current_user;
$$ language sql strict SET client_min_messages to error;

3、USERENV('ACTION')

create OR replace function get_ACTION() returns text AS $$
  select application_name from pg_stat_activity where pid=pg_backend_pid();
$$ language sql strict SET client_min_messages to error;

使用例子:

test=> select userenv('isdba'::Text);
 userenv
---------
 false
(1 row)  

test=> select userenv('action'::Text);
 userenv
---------
 psql
(1 row)  

test=> select userenv('sessionid'::Text);
 userenv
---------
 1
(1 row)  

test=> select userenv('hello'::Text);
 userenv
---------  

(1 row)

其他的ENV变量请自行增加,PG的各种获取渠道,动态视图、管理函数等如下。

https://www.postgresql.org/docs/10/static/functions-info.html

https://www.postgresql.org/docs/9.6/static/monitoring-stats.html#MONITORING-STATS-VIEWS

https://www.postgresql.org/docs/9.6/static/multibyte.html

时间: 2024-11-02 18:14:00

PostgreSQL Oracle 兼容性 之 USERENV的相关文章

PostgreSQL Oracle兼容性之 - plpgsql 自治事务(autonomous_transaction)补丁

PostgreSQL Oracle兼容性之 - plpgsql 自治事务(autonomous_transaction)补丁 作者 digoal 日期 2016-11-04 标签 PostgreSQL , autonomous_transaction , 自治事务 , Oracle兼容性 , plpgsql 背景 PostgreSQL的plpgsql服务端编程语言与Oracle数据库的pl/sql编程语言非常类似,但是对于自治事务一直没有语法层面的支持. 以往如果要支持自治事务,可以使用exce

PostgreSQL Oracle 兼容性之 - rowid (CREATE TABLE WITH OIDS)

标签 PostgreSQL , Oracle , 兼容性 , 行号 , rowid , oid , ctid 背景 Oracle的数据中,通过ROWID可以定位到一条记录,当记录没有发生行迁移时,ROWID是不变的,因此即使不使用PK,也能很好的定位到一条记录. PostgreSQL中,也有行号,CTID,由BLOCK_ID和ITEM_ID组成,即哪个数据块的哪条记录. 但是PostgreSQL的引擎为多版本引擎,因此一条记录在被更新后CTID会发生变化(代表了新的版本). 不管是Oracle还

PostgreSQL Oracle兼容性 之 - parser SQL保留|关键字(keywrods)大全

标签 PostgreSQL , keywords , 关键字 , Oracle 兼容性 背景 PostgreSQL数据库中有哪些关键字,这些关键字的使用限制如何? https://www.postgresql.org/docs/10/static/sql-keywords-appendix.html 文档中的说明并不是特别清晰,(并且KEYWORDS与版本强相关),所以使用pg_get_keywords这个系统函数得到的,更加准确可读. https://www.postgresql.org/do

PostgreSQL Oracle 兼容性之 - timestamp 与 numeric 的运算

标签 PostgreSQL , Oracle , 兼容性 , timestamp , numeric 背景 Oracle里面支持时间戳与数字的加减,数字默认单位为天. PostgreSQL 支持时间戳与interval类型进行加减.日期支持与整型做加减. 为了兼容Oracle(时间戳与数字加减),我们可以复写操作符来实现时间戳与数字的加减. 复写操作符 1.自定义几个函数,用于时间戳与数字的加减. postgres=# create or replace function timestamp_a

PostgreSQL Oracle 兼容性 之 TABLE、PIPELINED函数

标签 PostgreSQL , 返回表 , 返回复合类型 , 返回游标 背景 Oracle 通过table, pipelined函数,用于格式化返回类型为table的函数的结果. Table function concepts There a couple of steps to take when you are working with table functions. Like when you are working with normal tables you have to desc

PostgreSQL Oracle 兼容性之 - 系统列(ctid, oid, cmin, cmax, xmin, xmax)

标签 PostgreSQL , Oracle , 兼容性 , ctid , cmin , cmax , xmin , xmax , oid 背景 PostgreSQL中有一些系统列(即行的头部信息的列),例如物理行号,COMMAND ID,事务号,以及OID. 当我们建表时,不能使用冲突的列名,否则会报错: postgres=# create table a(ctid int); 错误: 42701: 字段名 "ctid" 与系统字段名冲突 LOCATION: CheckAttribu

PostgreSQL Oracle 兼容性 之 - PL/SQL record, table类型定义

背景 Oracle PL/SQL是非常强大的一门SQL编程语言,许多Oracle用户也使用它来处理一些要求延迟低且数据一致性或可靠性要求很高的业务逻辑. PostgreSQL也有一门非常高级的内置SQL编程语言,plpgsql.与Oracle PL/SQL语法极其类似,但是还是有一些不一样的地方.(PS:除了plpgsql,PostgreSQL还支持C,java,python,perl等流行的语言作为数据库的函数编程语言) 本文是针对有Oracle用户遇到的一些函数语法与PostgreSQL不兼

PostgreSQL Oracle兼容性 - 计算字符长度与字节长度(char(?) 与varchar(?)空格如何计算长度)

标签 PostgreSQL , Oracle , 字符长度 , 字节长度 , 空格 , varchar , char , 定长 , 变长 , 末尾追加空格 背景 由于多字节字符的存在,所以在数据库应用中,通常会出现两种计算字符串长度的需求: 1.计算字符串个数 2.计算字节数 在不同的数据库中,使用的函数不一样. 如何计算字符和字节个数 https://stackoverflow.com/questions/17062065/how-to-select-data-items-of-a-certa

PostgreSQL Oracle 兼容性 之 NUMTODSINTERVAL

标签 PostgreSQL , Oracle , NUMTODSINTERVAL , interval , number互转 背景 NUMTODSINTERVAL 是Oracle数字转时间间隔类型的函数. 例子: SELECT NUMTODSINTERVAL(100, 'day') FROM dual; SELECT NUMTODSINTERVAL(100, 'HOUR') FROM dual; SELECT NUMTODSINTERVAL(100, 'MINUTE') FROM dual; S