执行SHOW_SPACE存储过程时只能在DBA角色下成功,在NORMAL角色用户下报错:

ORA-10618: Operation not allowed on this segment
ORA-06512: at "SYS.DBMS_SPACE", line 167
ORA-06512: at "DMS.SHOW_SPACE", line 65
ORA-06512: at line 2

遇到ORA -error 第一件要做的事情就是查看 "error message"

ORA-10618: Operation not allowed on this segment
Cause: This DBMS_SPACE operation is not permitted on segments in tablespaces with
AUTO SEGMENT SPACE MANAGEMENT
Action: Recheck the segment name and type and re-issue the statement

意思就是说 dbms_space这个包只能在非自动段空间管理的表空间上用.

查查 dba_tablespaces.

Not quite correct. That particular operation, or procedure/function, is only permitted on non-ASSM tablespace. But some other procedures, such as spce_usage, is used on ASSM.

终于找到毛病了,原来是没有权限。虽然当前用户执行语句是有权限的,但是放到存储过程中就必须要显式的赋个权限给当前用户。以下是我找到的资料,贴出来给大家也看一下吧。
=====================
【IT168 技术文档】我们知道,用户拥有的role权限在存储过程是不可用的。如:  
 
   SQL>  select  from  dba_role_privs  where  grantee= 'SUK' ;
 
   GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
   ------------ ------------ ------------ ------------
   SUK DBA  NO  YES
   SUK  CONNECT  NO  YES
   SUK RESOURCE  NO  YES
 
   --用户SUK拥有DBA这个role
 
   --再创建一个测试存储过程:
   create  or  replace  procedure  p_create_table  
   is
   begin
   Execute  Immediate  'create table create_table(id int)' ;
   end  p_create_table;
 
   --然后测试
   SQL>  exec  p_create_table;
 
   begin  p_create_table;  end ;
 
   ORA-01031: 权限不足
   ORA-06512: 在 "SUK.P_CREATE_TABLE" , line 3
   ORA-06512: 在line 1
 
   --可以看到,即使拥有DBA role,也不能创建表。role在存储过程中不可用。
   --遇到这种情况,我们一般需要显式进行系统权限,如grant create table to suk;
   --但这种方法太麻烦,有时候可能需要进行非常多的授权才能执行存储过程
   --实际上,oracle给我们提供了在存储过程中使用role权限的方法:
   --修改存储过程,加入Authid Current_User时存储过程可以使用role权限。
   create  or  replace  procedure  p_create_table  
   Authid  Current_User  is
   begin
   Execute  Immediate  'create table create_table(id int)' ;
   end  p_create_table;
 
   --再尝试执行:
   SQL>  exec  p_create_table;
 
   PL/SQL  procedure  successfully completed
 
   --已经可以执行了。
权限是有的,只是执行的时候需要显式的声明一下。
 
第 1 行出现错误:
ORA-10618: Operation not allowed on this segment
ORA-06512: 在 "SYS.DBMS_SPACE", line 152
ORA-06512: 在 "SYS.SHOW_SPACE", line 21
ORA-06512: 在 line 1

发现这是由于表空间的ASSM方式引起的
要能够执行该脚本,则需要在手动段空间管理模式下。
创建一个MSSM表空间:
SQL> create tablespace mantbs datafile 'E:\oracle\oradata\lyon\mantbs01.dbf' size 10m uniform. size 1m segment space management manual;
表空间已创建。

将用户在mantbs上的空间配额修改为不限制:
SQL> alter user lyon quota unlimited on mantbs;
用户已更改。

将表移动到该表空间下:
SQL> alter table bigcol move tablespace mantbs
  2  /
表已更改。

SQL> call show_space('BIGCOL',user);

调用完成。

SQL> show message;
SP2-0158: 未知的 SHOW 选项 "message"
SQL> set serveroutput on;
SQL> /
Free Blocks.............................0
Total Blocks............................128
Total Bytes.............................1048576
Unused Blocks...........................127
Unused Bytes............................1040384
Last Used Ext FileId....................23
Last Used Ext BlockId...................137
Last Used Block.........................1

调用完成。
即可查看该表占用空间情况。

 
发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

ora-01652无法通过128(在temp表空间中)扩展temp段详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。