例如以下一个存储过程是dba创建一个表空间、创建一个用户并给这个用户授予权限:

create or replace procedure createTS(tname in varchar2)

is
    PRAGMA AUTONOMOUS_TRANSACTION;
    v_createsql   varchar2(400);
    vtbsname varchar2(40);
begin
    vtbsname := tname;
    v_createsql:='CREATE TABLESPACE '|| vtbsname ||' DATAFILE ''F:\APP\ADMINISTRATOR\ORADATA\'|| vtbsname ||'.dbf'' SIZE 30M AUTOEXTEND ON NEXT 10M';
        Dbms_Output.Put_Line(v_createsql);
   execute immediate v_createsql;
   
     v_createsql:='CREATE USER '|| vtbsname ||'  identified by '|| vtbsname ||' default tablespace  '||vtbsname;
        Dbms_Output.Put_Line(v_createsql);
   execute immediate v_createsql;
   
  --  v_createsql:='grant  ALTER SESSION,CREATE CLUSTER,CREATE DATABASE LINK,CREATE SEQUENCE,CREATE SESSION ,CREATE SYNONYM,CREATE VIEW to '|| vtbsname;
   -- v_createsql:='GRANT CREATE SESSION,CREATE CLUSTER,CREATE INDEXTYPE,CREATE OPERATOR,CREATE PROCEDURE,CREATE SEQUENCE,CREATE TABLE,CREATE TRIGGER,CREATE TYPE,INSERT ANY TABLE,UPDATE ANY TABLE,SELECT ANY TABLE,DELETE ANY TABLE to '|| vtbsname;
   v_createsql:='GRANT connect,resource to '|| vtbsname;
        Dbms_Output.Put_Line(v_createsql);
   execute immediate v_createsql;

end createTS;

PROCEDURE CREATETS 已编译

编译通过,例如以下运行

set serveroutput on;
execute createTS('nk_develop14061342');

 

在行 28 上開始运行命令时出错:
execute createTS('nk_develop14061343')
错误报告:
ORA-01031: 权限不足
ORA-06512: 在 "NK_DEVELOP131021.CREATETS", line 22
ORA-06512: 在 line 1
01031. 00000 -  "insufficient privileges"
*Cause:    An attempt was made to change the current username or password
           without the appropriate privilege. This error also occurs if
           attempting to install a database without the necessary operating
           system privileges.
           When Trusted Oracle is configure in DBMS MAC, this error may occur
           if the user was granted the necessary privilege at a higher label
           than the current login.
*Action:   Ask the database administrator to perform the operation or grant
           the required privileges.
           For Trusted Oracle users getting this error although granted the
           the appropriate privilege at a higher label, ask the database
           administrator to regrant the privilege at the appropriate label.
CREATE TABLESPACE nk_develop14061343 DATAFILE 'F:\APP\ADMINISTRATOR\ORADATA\nk_develop14061343.dbf' SIZE 30M AUTOEXTEND ON NEXT 10M
CREATE USER nk_develop14061343  identified by nk_develop14061343 default tablespace  nk_develop14061343
GRANT connect,resource to nk_develop14061343 

原因是在运行授予权限之时因为权限不足造成的

 

最终找到毛病了,原来是没有权限。尽管当前用户运行语句是有权限的,可是放到存储过程中就必需要显式的赋个权限给当前用户。下面是我找到的资料,贴出来给大家也看一下吧。
=====================
【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


  --已经能够运行了。

原来 是要使用调用者权限

因此在创建存储过程时须要增加Authid Current_User当前用户的权限

create or replace procedure createTS(tname in varchar2)
Authid Current_User
is

 
 

 

要在存储过程里动态创建创建表空间例如以下步骤。
1、须要採用Oracle自治事务

就在存储过程里增加PRAGMA AUTONOMOUS_TRANSACTION;子句
2、须要显示的分配置创建表空间的权限,否则提示权限不足。
grant alter tablespace to TEST;
grant create tablespace to TEST;

 

 

感谢网址楼主

http://www.dbfaq.net/FAQ/FixupQL.aspx?QuestionID=112