例如以下一个存储过程是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
原因是在运行授予权限之时因为权限不足造成的
找到一个帖子例如以下:http://bbs.csdn.net/topics/360053754
最终找到毛病了,原来是没有权限。尽管当前用户运行语句是有权限的,可是放到存储过程中就必需要显式的赋个权限给当前用户。下面是我找到的资料,贴出来给大家也看一下吧。
=====================
【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
http://bbs.csdn.net/topics/360053754