前言:
平时在SCOTT用户上做实验时需要用到AUTOTRACE功能
但由于没有权限,所以会报以下错误:
SQL> conn scott/a123456
已连接。
SQL> set autotrace traceonly
SP2-0618: 无法找到会话标识符。启用检查 PLUSTRACE 角色
SP2-0611: 启用 STATISTICS 报告时出错
上网搜了下是由于SCOTT用户没有PLUSTRACE 角色权限导致的。
现在来创建PLUSTRACE 角色并赋权给PUBLIC
----
实验:
-- 参考eygle的文章:http://www.eygle.com/faq/AutoTrace.htm
SQL> conn sys/a123456 as sysdba
已连接。
SQL> show user
USER 为 "SYS"
SQL> @?\rdbms\admin\utlxplan
表已创建。
已用时间: 00: 00: 00.18
SQL> create public synonym plan_table for plan_table;
create public synonym plan_table for plan_table
*
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用
已用时间: 00: 00: 00.06
SQL> grant all on plan_table to public ;
授权成功。
已用时间: 00: 00: 00.07
SQL> @?\sqlplus\admin\plustrce
SQL> drop role plustrace;
drop role plustrace
*
第 1 行出现错误:
ORA-01919: 角色 'PLUSTRACE' 不存在
已用时间: 00: 00: 00.03
SQL> create role plustrace;
角色已创建。
已用时间: 00: 00: 00.08
SQL>
SQL> grant select on v_$sesstat to plustrace;
授权成功。
已用时间: 00: 00: 00.01
SQL> grant select on v_$statname to plustrace;
授权成功。
已用时间: 00: 00: 00.01
SQL> grant select on v_$mystat to plustrace;
授权成功。
已用时间: 00: 00: 00.03
SQL> grant plustrace to dba with admin option;
授权成功。
已用时间: 00: 00: 00.01
SQL>
SQL> set echo off
SQL>
SQL> grant plustrace to public ;
授权成功。
--
到此为止,已经成功给所有用户赋予执行AUTOTRACE的权限了。现在切换到SCOTT用户支测试一下
已用时间: 00: 00: 00.01
SQL> conn scott/a123456
已连接。
SQL> set autot trace
已用时间: 00: 00: 00.02
SQL> select * from emp ;
已选择14行。
已用时间: 00: 00: 00.01
执行计划
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 532 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 532 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
统计信息
----------------------------------------------------------
104 recursive calls
0 db block gets
23 consistent gets
0 physical reads
0 redo size
1631 bytes sent via SQL*Net to client
519 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
--=========================================================================--
以下是刚才用到的两个脚本的内容:
--1.?\rdbms\admin\utlxplan
/*
create table PLAN_TABLE (
statement_id varchar2(30),
plan_id number,
timestamp date,
remarks varchar2(4000),
operation varchar2(30),
options varchar2(255),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_alias varchar2(65),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id numeric,
depth numeric,
position numeric,
cost numeric,
cardinality numeric,
bytes numeric,
other_tag varchar2(255),
partition_start varchar2(255),
partition_stop varchar2(255),
partition_id numeric,
other long,
distribution varchar2(30),
cpu_cost numeric,
io_cost numeric,
temp_space numeric,
access_predicates varchar2(4000),
filter_predicates varchar2(4000),
projection varchar2(4000),
time numeric,
qblock_name varchar2(30),
other_xml clob
);
*/
-- 2. ?\sqlplus\admin\plustrce
/*
set echo on
drop role plustrace;
create role plustrace;
grant select on v_$sesstat to plustrace;
grant select on v_$statname to plustrace;
grant select on v_$mystat to plustrace;
grant plustrace to dba with admin option;
set echo off
*/