v$sessionってVIEWだと勘違いしている人多くないですか?自分も最初そう思っていました。実はPUBLIC SYNONYMなんです。(ついでに言うと、データディクショナリであるDBA_OBJECTSやDBA_TABLESもPUBLIC SYNONYMなっていて何れもSYSのVIEWです。)
DBA_OBJECTSで確認できます
col owner for a10
col object_name for a30
col object_type for a10
select owner, object_name, object_type from dba_objects where object_name ='V$SESSION'
;
OWNER OBJECT_NAME OBJECT_TYP
---------- ------------------------------ ----------
PUBLIC V$SESSION SYNONYM
SQL>
DBMS_METADATA.GET_DDL()でDDLを確認できます
ついでにDDLも確認しておきます。as sysdbaでログインしないと確認できません。
set lin 100
select DBMS_LOB.SUBSTR(dbms_metadata.get_ddl('SYNONYM','V$SESSION','PUBLIC'),200,1) from dual
;
DBMS_LOB.SUBSTR(DBMS_METADATA.GET_DDL('SYNONYM','V$SESSION','PUBLIC'),200,1)
----------------------------------------------------------------------------------------------------
CREATE OR REPLACE NONEDITIONABLE PUBLIC SYNONYM "V$SESSION" FOR "SYS"."V_$SESSION"
SQL>
col owner for a10
col object_name for a12
col object_type for a10
col status for a10
select OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS from all_objects where OBJECT_NAME= 'V_$SESSION'
;
OWNER OBJECT_NAME OBJECT_TYP STATUS
---------- ------------ ---------- ----------
SYS V_$SESSION VIEW VALID
SQL>
この通り、実はSYSが保持するV_$SESSIONという名前のVIEWの「パブリックシノニム」がV$SESSIONなのです。この為、ファンクションやプロシージャ内でv$sessionをそのまま使おうとしたら使えない経験ありませんでしたか?このような場合はそのユーザに対しV_$SESSIONのselect 権限を付与する必要があります。