对于大部分视图而言,返回结果是固定的。但是利用一些变量可以创建动态结果的视图。下面是我常用的创建动态视图的方法:
比如对dba_jobs表权限的控制
create or replace view sys.user_jobs as select j."JOB",j."LOG_USER",j."PRIV_USER",j."SCHEMA_USER",j."LAST_DATE",j."LAST_SEC",j."THIS_DATE",j."THIS_SEC",j."NEXT_DATE",j."NEXT_SEC",j."TOTAL_TIME",j."BROKEN",j."INTERVAL",j."FAILURES",j."WHAT",j."NLS_ENV",j."MISC_ENV",j."INSTANCE" from dba_jobs j, sys.user$ u where j.priv_user = u.name and u.user# = USERENV('SCHEMAID')
由于使用了USERENV函数获取SCHEMAID信息,使得不同的用户登陆获得的方案ID不同,从而使得不同的用户访问user_jobs视图获得的结果不同。 select * from user_jobs; --只能查询到当前登录用户的能看到的job select USERENV('SCHEMAID') from dual ;
比如返回282,那么可以查询sys.user$查看该用户的信息,select * from sys.user$ r where r.user#='282' ;
补充:userenv('sessionid'),可以获得当前登录用户的会话信息,比如进程的SID和SERIAL#
-- 获取本进程的SID和SERIAL# select sid, serial# into v_sid, v_serial# from v$session where sid = (select max(sid) from v$session where AUDSID = userenv('sessionid'));