【Oracle】v$表和v_$同义词的访问权限

买了最新的11gr2tom kyte的书编程艺术,参考其中的例子做实验,发现:

yang@RAC> create or replace view stats

  2  as select 'STAT...' || a.name name, b.value

  3        from v$statname a, v$mystat b

  4       where a.statistic# = b.statistic#

  5      union all

  6      select 'LATCH.' || name,  gets

  7        from v$latch

  8          union all

  9          select 'STAT...Elapsed Time', hsecs from v$timer;

      from v$statname a, v$mystat b

           *

ERROR at line 3:

ORA-01031: insufficient privileges

单独查询则是可以的。

yang@RAC> select 'STAT...' || a.name name, my.value

  2        from v$statname a, v$mystat my

  3       where a.statistic# = my.statistic# and rownum < 5;

NAME                                                                         VALUE

----------------------------------------------------------------------- ----------

STAT...OS CPU Qt wait time                                                       0

STAT...logons cumulative                                                         1

STAT...logons current                                                            1

STAT...opened cursors cumulative                                               101

查询之后,了解到对于v$对象,并不是视图,而是指向v_$视图的同义词,而视图是基于真正的v$视图创建的,包括X$,这些对象是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序动态创建。

这部分表对数据库来说至关重要,所以Oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许。

sys@RAC>  grant select on v_$statname to yang;

Grant succeeded.

sys@RAC> 

sys@RAC>    

sys@RAC> grant select on v_$latch to yang;

Grant succeeded.

sys@RAC> grant select on v_$timer to yang;

Grant succeeded.

sys@RAC> conn yang/yang

Connected.

yang@RAC> 

yang@RAC> drop table run_stats;

Table dropped.

yang@RAC> @runstats_pkg.sql

SP2-0310: unable to open file "runstats_pkg.sql"

yang@RAC> !ls

big_table.sql  ch00  ch02  ch04  ch06  ch08  ch10  ch12  ch14  ch16         login.sql    mystat.sql    show_space.sql

book.zip       ch01  ch03  ch05  ch07  ch09  ch11  ch13  ch15  demobld.sql  mystat2.sql  runstats.sql  tk.sql

yang@RAC> @runstats.sql

yang@RAC> set echo on

yang@RAC> 

yang@RAC> drop table run_stats;

drop table run_stats

           *

ERROR at line 1:

ORA-00942: table or view does not exist

yang@RAC> create global temporary table run_stats

  2  ( runid varchar2(15),

  3    name varchar2(80),

  4    value int )

  5  on commit preserve rows;

Table created.

yang@RAC> 

yang@RAC> grant select any table to yang;

Grant succeeded.

yang@RAC> create or replace view stats

  2  as select 'STAT...' || a.name name, b.value

  3        from v$statname a, v$mystat b

  4       where a.statistic# = b.statistic#

  5      union all

  6      select 'LATCH.' || name,  gets

  7        from v$latch

  8          union all

  9          select 'STAT...Elapsed Time', hsecs from v$timer;

View created.

yang@RAC> 

yang@RAC> 

yang@RAC> delete from run_stats;

0 rows deleted.

yang@RAC> commit;

Commit complete.

yang@RAC> 

yang@RAC> create or replace package runstats_pkg

  2  as

  3      procedure rs_start;

  4      procedure rs_middle;

  5      procedure rs_stop( p_difference_threshold in number default 0 );

  6  end;

  7  /

Package created.

yang@RAC> 

yang@RAC> create or replace package body runstats_pkg

  2  as

  3  

  4  g_start number;

  5  g_run1     number;

  6  g_run2     number;

  7  

  8  procedure rs_start

  9  is

 10  begin

 11      delete from run_stats;

 12  

 13      insert into run_stats

 14      select 'before', stats.* from stats;

 15  

 16      g_start := dbms_utility.get_cpu_time;

 17  end;

 18  

 19  procedure rs_middle

 20  is

 21  begin

 22      g_run1 := (dbms_utility.get_cpu_time-g_start);

 23  

 24      insert into run_stats

 25      select 'after 1', stats.* from stats;

 26      g_start := dbms_utility.get_cpu_time;

 27  

 28  end;

 29  

 30  procedure rs_stop(p_difference_threshold in number default 0)

 31  is

 32  begin

 33      g_run2 := (dbms_utility.get_cpu_time-g_start);

 34  

 35      dbms_output.put_line

 36      ( 'Run1 ran in ' || g_run1 || ' cpu hsecs' );

 37      dbms_output.put_line

 38      ( 'Run2 ran in ' || g_run2 || ' cpu hsecs' );

 39          if ( g_run2 <> 0 )

 40          then

 41      dbms_output.put_line

 42      ( 'run 1 ran in ' || round(g_run1/g_run2*100,2) ||

 43        '% of the time' );

 44          end if;

 45      dbms_output.put_line( chr(9) );

 46  

 47      insert into run_stats

 48      select 'after 2', stats.* from stats;

 49  

 50      dbms_output.put_line

 51      ( rpad( 'Name', 30 ) || lpad( 'Run1', 12 ) ||

 52        lpad( 'Run2', 12 ) || lpad( 'Diff', 12 ) );

 53  

 54      for x in

 55      ( select rpad( a.name, 30 ) ||

 56               to_char( b.value-a.value, '999,999,999' ) ||

 57               to_char( c.value-b.value, '999,999,999' ) ||

 58               to_char( ( (c.value-b.value)-(b.value-a.value)), '999,999,999' ) data

 59          from run_stats a, run_stats b, run_stats c

 60         where a.name = b.name

 61           and b.name = c.name

 62           and a.runid = 'before'

 63           and b.runid = 'after 1'

 64           and c.runid = 'after 2'

 65           -- and (c.value-a.value) > 0

 66           and abs( (c.value-b.value) - (b.value-a.value) )

 67                 > p_difference_threshold

 68         order by abs( (c.value-b.value)-(b.value-a.value))

 69      ) loop

 70          dbms_output.put_line( x.data );

 71      end loop;

 72  

 73      dbms_output.put_line( chr(9) );

 74      dbms_output.put_line

 75      ( 'Run1 latches total versus runs -- difference and pct' );

 76      dbms_output.put_line

 77      ( lpad( 'Run1', 12 ) || lpad( 'Run2', 12 ) ||

 78        lpad( 'Diff', 12 ) || lpad( 'Pct', 10 ) );

 79  

 80      for x in

 81      ( select to_char( run1, '999,999,999' ) ||

 82               to_char( run2, '999,999,999' ) ||

 83               to_char( diff, '999,999,999' ) ||

 84               to_char( round( run1/decode( run2, 0, to_number(0), run2) *100,2 ), '99,999.99' ) || '%' data

 85          from ( select sum(b.value-a.value) run1, sum(c.value-b.value) run2,

 86                        sum( (c.value-b.value)-(b.value-a.value)) diff

 87                   from run_stats a, run_stats b, run_stats c

 88                  where a.name = b.name

 89                    and b.name = c.name

 90                    and a.runid = 'before'

 91                    and b.runid = 'after 1'

 92                    and c.runid = 'after 2'

 93                    and a.name like 'LATCH%'

 94                  )

 95      ) loop

 96          dbms_output.put_line( x.data );

 97      end loop;

 98  end;

 99  

100  end;

101  /

Package body created.

这次可以了。。

时间: 2024-10-30 03:07:00

【Oracle】v$表和v_$同义词的访问权限的相关文章

oracle 创建表空间、新用户及权限

刚开始学习ORCLE的时候,一般都是采用默认的系统账户,系统账户有时会有些局限性,尤其是做项目的时候,创建新的用户就成为必然的. 首先创建表空间,在这个表空间创建新用户,给新用户授权,然后使用新用户登录PL/SQL管理工具,最后创建数据库相关对象. 工具/原料 PL/SQL管理工具 方法/步骤 首先通过ORACLE默认的系统账户登录PL/SQL管理工具(如:system/manager) 新建查询窗口,执行表空间语句, 如:"Create tablespace ts1 datafile 'D:\

Oracle学习(四) 同义词与数据库链接

1.同义词: 在分布式数据库环境中,为了识别一个数据库对象,必须规定主机名.服务器名.对象的拥有者和对 象名.这无疑增加了访问者的访问难度.为了给不同的用户使用数据库对象时提供一个简单的.唯一标 识数据库对象的名称,可以为数据库对象创建同义词. 举例说明:假设我们在数据库database中有一个用户user拥有表table,那么当数据库database中的 其他用户需要访问table表的时候需要使用user.table的方式访问,这就要求我们在访问table表的时候 必须知道table表的拥有者

如何查看Oracle数据表的建表语句

oracle|数据|语句 如何查看Oracle数据表的建表语句? 系统环境:  1.操作系统:Windows 2000 Server,机器内存128M 2.数据库: Oracle 8i R2 (8.1.6) for NT 企业版 3.安装路径:C:\ORACLE 实现步骤:  1.用EXP工具导出 2.导入时使用show=y选项.log选项 3.查看.编辑日志文件 具体实例:  1.调出SQL*Plus conn system/manager grant connect,resource to

如何查看Oracle数据表的建表语句?

oracle|数据|语句 如何查看Oracle数据表的建表语句? 系统环境:  1.操作系统:Windows 2000 Server,机器内存128M 2.数据库: Oracle 8i R2 (8.1.6) for NT 企业版 3.安装路径:C:\ORACLE 实现步骤:  1.用EXP工具导出 2.导入时使用show=y选项.log选项 3.查看.编辑日志文件 具体实例:  1.调出SQL*Plus conn system/manager grant connect,resource to 

Oracle数据库表与视图

oracle|视图|数据|数据库 Oracle数据库数据对象中最基本的是表和视图,其他还有约束.序列.函数.存储过程.包.触发器等.对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数据库对象是学习Oracle的捷径. 表和视图 Oracle中表是数据存储的基本结构.ORACLE8引入了分区表和对象表,ORACLE8i引入了临时表,使表的功能更强大.视图是一个或多个表中数据的逻辑表达式.本文我们将讨论怎样创建和管理简单的表和视图. 管理表 表可以看作有行和列的电子数据表,表是关

ORACLE外部表总结

外部表介绍   ORACLE外部表用来存取数据库以外的文本文 件(Text File)或ORACLE专属格式文件.因此,建立外部表时不会产生段.区.数据块等存储结构,只有与表相关的定义放在数据字典中.外部表,顾名思义,存 储在数据库外面的表.当存取时才能从ORACLE专属格式文件中取得数据,外部表仅供查询,不能对外部表的内容进行修改(INSERT.UPDATE. DELETE操作).不能对外部表建立索引.因为创建索引就意味着要存在对应的索引记录.而外部表其实在没有存储在数据库中.故在外部是无法建

Oracle 外部表

--================= -- Oracle 外部表 --=================       外部表只能在Oracle 9i 之后来使用.简单地说,外部表,是指不存在于数据库中的表.通过向Oracle提供描述外部表的元数据,我们 可以把一个操作系统文件当成一个只读的数据库表,就像这些数据存储在一个普通数据库表中一样来进行访问.外部表是对数据库表的延伸.   一.外部表的特性     位于文件系统之中,按一定格式分割,如文本文件或者其他类型的表可以作为外部表.     对

Oracle 数据表分区的策略_oracle

正在看的ORACLE教程是:Oracle 数据表分区的策略.本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义, 本文的工作在Oracle8.1.6下实现. Oracle虽然是一个大型的DBMS,但如果不对记录比较多的表进行处理,仍然发挥不了Oracle管理大型数据的强大功能,因此对某些表进行分区,具有如下优点:  分区表中每个分区可以在逻辑上认为是一个独立的对象:  可以在一个表中的一个或多个分区上进行如删

Oracle数据表分区的策略_oracle

正在看的ORACLE教程是:Oracle数据表分区的策略.本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义, 本文的工作在Oracle8.1.6下实现. Oracle虽然是一个大型的DBMS,但如果不对记录比较多的表进行处理,仍然发挥不了Oracle管理大型数据的强大功能,因此对某些表进行分区,具有如下优点: 分区表中每个分区可以在逻辑上认为是一个独立的对象: 可以在一个表中的一个或多个分区上进行如删除.移