Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6682586
  • 博文数量: 1005
  • 博客积分: 8199
  • 博客等级: 中将
  • 技术积分: 13071
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-25 20:19
个人简介

脚踏实地、勇往直前!

文章分类

全部博文(1005)

文章存档

2020年(2)

2019年(93)

2018年(208)

2017年(81)

2016年(49)

2015年(50)

2014年(170)

2013年(52)

2012年(177)

2011年(93)

2010年(30)

分类: Oracle

2012-07-21 03:12:40

环境:
OS:Red Hat Linux As5
DB:10.2.0.4
 
今天写了个自动维护分区的程序,mydb用户具有dba权限,自动分区维护在mydba用户下,scott创建了分区表,然后然后执行自动分区程序,自动维护分区程序执行的是动态DDL,执行的时候报ORA-00942: 表或视图不存在,将该执行语句提取出来执行没问题.
 
1.查看mydba的权限
Select Pri.Grantee,
       Pri.Privilege,
       Pri.Admin_Option,
       Case
         When Type = '1' Then
          'Privs'
         When Type = '2' Then
          'Role'
       End Type
  From (Select Sp.Grantee, Sp.Privilege, Sp.Admin_Option, '1' Type
          From Dba_Sys_Privs Sp
        Union All
        Select Rp.Grantee, Rp.Granted_Role, Rp.Admin_Option, '2' Type
          From Dba_Role_Privs Rp) Pri
 Where Pri.Grantee = 'MYDBA'
GRANTEE PRIVILEGE ADMIN_OPTION TYPE
------------------------------------
MYDBA UNLIMITED TABLESPACE NO Privs
MYDBA DBA                   NO Role
 
2.执行自动分区程序
SQL> Declare
  2    po_error_msg Varchar2(4000);
  3  begin
  4    pkg_management_part_table.management_part_table(po_error_msg);
  5    dbms_output.put_line(po_error_msg);
  6  end;
  7  /
alter table SCOTT.TB_RANGE_PART_TEST02 add partition P_20120702
values less than(to_date(20120703,'YYYYMMDD'))
ORA-00942: table or view does not exist
 
直接执行SQL
SQL> alter table SCOTT.TB_RANGE_PART_TEST02 add partition P_20120702
  2  values less than(to_date(20120703,'YYYYMMDD'));
Table altered.
 
没有问题.
 
解决这个问题有两种办法,一种是将表的权限赋予mydba,另一种是在创建过程和包头上加上AUTHID CURRENT_USER.第一种方法对于维护的表很多的情况下,逐一赋予权限比较麻烦,这里采用第二种方法.
Create Or Replace Package Pkg_Management_Part_Table  AUTHID CURRENT_USER  Is
  Function Get_Max_Part_Name(Pi_Owner Varchar2, Pi_Table_Name Varchar2)
    Return Varchar2;
  Procedure Management_Part_Table(Po_Error_Msg Out Varchar2);
End;
 
3.再次执行过程
SQL> Declare
  2    po_error_msg Varchar2(4000);
  3  begin
  4    pkg_management_part_table.management_part_table(po_error_msg);
  5    dbms_output.put_line(po_error_msg);
  6  end;
  7  /
alter table SCOTT.TB_RANGE_PART_TEST02 add partition P_20120703
values less than(to_date(20120704,'YYYYMMDD'))
 
PL/SQL procedure successfully completed.
 
Oracle文档是这样说的:
You need AUTHID CURRENT_USER to execute dynamic package methods; otherwise, these methods raise an insufficient privileges error.
 
-- The End --
 
阅读(2887) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~