@@ -1192,3 +1192,100 @@ WHERE
11921192 AND PG_GET_USERBYID(C .RELOWNER ) = CURRENT_USER ;
11931193GRANT SELECT ON SYS .USER_VIEWS TO PUBLIC;
11941194
1195+ -- ----------------------------------------------
1196+ -- V$ DYNAMIC VIEWS
1197+ -- ----------------------------------------------
1198+
1199+ -- V$SESSION:
1200+ -- 1. For SID we use PG_STAT_ACTIVITY.PID and do not set SERIAL#:
1201+ -- we should avoid implementing "killing by SID" without either an additional counter or second factor like PG_STAT_ACTIVITY.BACKEND_START.
1202+ -- 2. SQL_ID is based on PG_STAT_ACTIVITY.QUERY_ID which depends on compute_query_id setting: SQL_ID is NULL if compute_query_id is 'off'.
1203+ -- SQL_ID is incompatible with Oracle because QUERY_ID a integer string in PostgreSQL and in Oracle SQL_ID is 13-character base32-encoded
1204+ -- hash.
1205+ --
1206+ -- We do not grant SELECT privilege on V$SESSION to PUBLIC because SQL_TEXT is retrieved.
1207+ -- We do not grant SELECT privilege on V$PROCESS or on V$PARAMETER to PUBLIC
1208+ -- because it contradicts with least security privilege principle.
1209+
1210+ CREATE OR REPLACE VIEW SYS .V$SESSION AS
1211+ SELECT
1212+ PG_STAT_ACTIVITY .PID ::NUMBER AS SID,
1213+ USENAME::VARCHAR2 (128 ) AS USERNAME,
1214+ CASE WHEN STATE = ' active' OR STATE = ' fastpath function call' THEN ' ACTIVE'
1215+ WHEN STATE = ' idle' OR STATE = ' idle in transaction'
1216+ OR STATE = ' idle in transaction (aborted)' THEN ' INACTIVE'
1217+ ELSE ' INACTIVE'
1218+ END::VARCHAR2 (40 ) AS STATUS,
1219+ COALESCE(CLIENT_HOSTNAME, HOST(CLIENT_ADDR),CLIENT_ADDR::TEXT )::VARCHAR2 (128 ) AS MACHINE,
1220+ APPLICATION_NAME::VARCHAR2 (256 ) AS PROGRAM,
1221+ CASE WHEN BACKEND_TYPE = ' client backend' THEN ' USER'
1222+ ELSE ' BACKGROUND'
1223+ END::VARCHAR2 (30 ) AS TYPE,
1224+ BACKEND_START AS LOGON_TIME,
1225+ QUERY_START AS SQL_EXEC_START,
1226+ QUERY_ID::VARCHAR2 (19 ) AS SQL_ID,
1227+ QUERY::VARCHAR2 (4000 ) AS SQL_TEXT,
1228+ (PG_CATALOG .PG_BLOCKING_PIDS (PID))[1 ]::NUMBER AS BLOCKING_SESSION,
1229+ WAIT_EVENT::VARCHAR2 (64 ) AS EVENT,
1230+ WAIT_EVENT_TYPE::VARCHAR2 (64 ) AS WAIT_CLASS,
1231+ XACT_START AS TRANSACTION_START,
1232+ CLIENT_PORT::NUMBER AS PORT
1233+ FROM PG_STAT_ACTIVITY;
1234+
1235+
1236+ -- V$PROCESS: USERNAME maps to the database username (pg_stat_activity.usename),
1237+ -- not the OS username as in Oracle V$PROCESS.
1238+ CREATE OR REPLACE VIEW SYS .V$PROCESS AS
1239+ SELECT
1240+ PID::NUMBER AS SPID,
1241+ USENAME::VARCHAR2 (128 ) AS USERNAME,
1242+ APPLICATION_NAME::VARCHAR2 (256 ) AS PROGRAM,
1243+ BACKEND_TYPE::VARCHAR2 (30 ) AS PNAME,
1244+ CASE WHEN BACKEND_TYPE = ' client backend' THEN NULL
1245+ ELSE ' 1'
1246+ END::VARCHAR2 (1 ) AS BACKGROUND
1247+ FROM PG_STAT_ACTIVITY;
1248+
1249+ CREATE OR REPLACE VIEW SYS .V$PARAMETER AS
1250+ SELECT
1251+ NAME::VARCHAR2 (80 ) AS NAME,
1252+ CASE
1253+ WHEN VARTYPE = ' bool' THEN 1
1254+ WHEN VARTYPE = ' integer' THEN 3
1255+ ELSE 2
1256+ END::NUMBER AS TYPE,
1257+ SETTING::VARCHAR2 (4000 ) AS VALUE,
1258+ BOOT_VAL::VARCHAR2 (255 ) AS DEFAULT_VALUE,
1259+ -- Mapping update levels
1260+ CASE
1261+ WHEN setting IS NOT DISTINCT FROM boot_val THEN ' TRUE'
1262+ ELSE ' FALSE'
1263+ END::VARCHAR2 (5 ) AS ISDEFAULT,
1264+ CASE
1265+ WHEN CONTEXT IN (' user' , ' superuser' ) THEN ' TRUE'
1266+ ELSE ' FALSE'
1267+ END::VARCHAR2 (5 ) AS ISSES_MODIFIABLE,
1268+ CASE
1269+ WHEN CONTEXT IN (' user' , ' superuser' ,' sighup' ) THEN ' IMMEDIATE'
1270+ WHEN CONTEXT IN (' postmaster' ,' internal' ) THEN ' FALSE'
1271+ ELSE ' DEFERRED'
1272+ END::VARCHAR2 (9 ) AS ISSYS_MODIFIABLE,
1273+ SHORT_DESC::VARCHAR2 (255 ) AS DESCRIPTION
1274+ FROM PG_SETTINGS;
1275+
1276+ -- DBA_CONS_COLUMNS
1277+ CREATE OR REPLACE VIEW sys .dba_cons_columns AS
1278+ SELECT
1279+ SYS .ORA_CASE_TRANS (pg_get_userbyid(n .oid )::varchar2 (128 )) AS owner,
1280+ SYS .ORA_CASE_TRANS (c .conname ::varchar2 (128 )) AS constraint_name,
1281+ SYS .ORA_CASE_TRANS (cl .relname ::varchar2 (128 )) AS table_name,
1282+ SYS .ORA_CASE_TRANS (a .attname ::varchar2 (128 )) AS column_name,
1283+ (row_number() OVER (PARTITION BY c .oid ORDER BY a .attnum ))::int AS position,
1284+ CASE WHEN a .attnotnull THEN ' Y' ELSE ' N' END AS nullable
1285+ FROM pg_constraint c
1286+ JOIN pg_class cl ON c .conrelid = cl .oid
1287+ JOIN pg_namespace n ON cl .relnamespace = n .oid
1288+ JOIN pg_attribute a ON a .attrelid = cl .oid AND a .attnum = ANY(c .conkey )
1289+ WHERE cl .relkind = ' r'
1290+ AND a .attisdropped = false
1291+ AND n .nspname NOT IN (' pg_catalog' , ' information_schema' );
0 commit comments