关于sqlplus的show parameter问题

这里先描述几个视图:v$parameter 、 v$system_parameter、v$spparameter

v$parameter : displays information about the initialization parameters that are currently in effect for the session. A new session inherits parameter values from the instance-wide values displayed by the V$SYSTEM_PARAMETER view. 

v$system_parameter : displays information about the initialization parameters that are currently in effect for the instance. A new session inherits parameter values from the instance-wide values.

v$spparameter : displays information about the contents of the server parameter file. If a server parameter file was not used to start the instance, then each row of the view will contain FALSE in the ISSPECIFIED column.

说白了就是:v$parameter描述会话级别的参数, v$system_parameter描述实例级别的参数, v$spparameter描述spfile文件的参数。新建的会话继承v$system_parameter里描述的参数。

问题:当以scott用户登录到数据库之后,想查看当前会话某个参数的值,可是报错了

C:\Users\zlf>sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 星期日 6月 15 20:10:21 2014

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

SQL> conn scott/tiger@demodb
已连接。
SQL> show user
USER 为 "SCOTT"
SQL> set linesize 200
SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80            800                    20
      7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
      7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
      7566 JONES      MANAGER         7839 02-4月 -81           2975                    20
      7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
      7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
      7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
      7839 KING       PRESIDENT            17-11月-81           5000                    10
      7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30
      7900 JAMES      CLERK           7698 03-12月-81            950                    30
      7902 FORD       ANALYST         7566 03-12月-81           3000                    20

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7934 MILLER     CLERK           7782 23-1月 -82           1300                    10

已选择12行。

SQL> show parameter nls_date_format
ORA-00942: table or view does not exist  -- 提示表或视图不存在

解释:当在sqlplus下通过show parameter parameter_name查询某个参数值时,后台实际上是查询v$parameter来返回会话参数。那为什么scott用户无法查看当前自己的会话参数呢?troubleshoot

1. 先要看看v$parameter是什么类型的对象

[oracle@redhat4 ~]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 6月 15 20:23:30 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn / as sysdba
Connected.
SQL> col object_name format a30
SQL> select owner,object_name,object_type from dba_objects where object_name='V$PARAMETER';

OWNER                          OBJECT_NAME                    OBJECT_TYPE
------------------------------ ------------------------------ -------------------
PUBLIC                         V$PARAMETER                    SYNONYM

SQL>

通过查询结果可以知道:v$parameter其实是一个public synonym, 既然是公共同义词,那所有用户都可以访问,为什么scott用户访问报错呢?猜测:v$parameter这个公共同义词指向的对象并没有把查询权限赋予public用户,导致最后查询还是失败。

2.  查看 同义词v$parameter指向哪个对象

SQL> conn / as sysoper
Connected.
SQL> show user
USER is "PUBLIC"
SQL> select SYNONYM_NAME,TABLE_OWNER,TABLE_NAME from user_synonyms where SYNONYM_NAME='V$PARAMETER';

SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME
------------------------------ ------------------------------ ------------------------------
V$PARAMETER                    SYS                            V_$PARAMETER

发现:同义词v$parameter其实指向sys.V_$PARAMETER

3. sys.V_$PARAMETER又是什么类型的对象

SQL> conn / as sysdba
Connected.
SQL> show user
USER is "SYS"
SQL> select object_name,object_type from user_objects where object_name='V_$PARAMETER';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
V_$PARAMETER                   VIEW

发现:sys.V_$PARAMETER其实是一个视图, 至于这个视图又是由哪几个表构成,这里就不介绍了。也就是说:我们通过show parameter查询的参数值其实是来自于

sys.V_$PARAMETER,可现在报错了,提示表或视图不存在。那我们再看看sys用户有没有将sys.V_$PARAMETER的查询权限赋予public用户

4. 查看sys用户有没有将sys.V_$PARAMETER的查询权限赋予public用户

QL> conn / as sysoper
Connected.
SQL> show user
USER is "PUBLIC"
SQL> select * from user_tab_privs where owner='SYS' and TABLE_NAME='V_$PARAMETER';

no rows selected  --没有

5. 找到问题的原因了,只要将sys.V_$PARAMETER的查询权限赋予public用户即可,当然也可以单独赋予单独的某一个用户

SQL> conn / as sysdba
Connected.
SQL> show user
USER is "SYS"
SQL> grant select on V_$PARAMETER to public;

Grant succeeded.

SQL> conn / as sysoper
Connected.
SQL> show user
USER is "PUBLIC"
SQL> select * from user_tab_privs where owner='SYS' and TABLE_NAME='V_$PARAMETER';

GRANTEE                    OWNER                          TABLE_NAME                     GRANTOR  PRIVILEGE                                GRA   HIE
PUBLIC                         SYS                                V_$PARAMETER                   SYS            SELECT                                   NO      NO
现在public用户拥有了对sys.V_$PARAMETER的查询权限,那数据库的所有用户自然也就拥有了。

6. 校验show parameter 是否可以

SQL> conn scott/tiger@demodb
已连接。
SQL> show user
USER 为 "SCOTT"
SQL> show parameter service_names

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      demodb
SQL>

OK,可以了。

 

 

 

 

 

你可能感兴趣的:(oracle)