zoukankan      html  css  js  c++  java
  • ORA-10618: Operation not allowed on this segment 执行存储过程权限需声明

    执行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:oracleoradatalyonmantbs01.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

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

     
  • 相关阅读:
    Dapper一个和petapoco差不多的轻量级ORM框架
    .net怎么使用Swagger
    java调用第三方的webservice应用实例【转载】
    基于spring boot的定时器
    不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)
    html onclick时间传字符串参数
    浏览器json格式化插件 yformater
    HTML5视频播放插件
    开发中用到过的技术链接
    我是如何一步步编码完成万仓网ERP系统的(十四)库存 3.库存日志
  • 原文地址:https://www.cnblogs.com/bolang100/p/6365452.html
Copyright © 2011-2022 走看看