您的位置:首页 > 其它

权限不足

2014-06-16 11:05 155 查看
如下一个存储过程是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: