码迷,mamicode.com
首页 > 其他好文 > 详细

权限不足

时间:2014-06-16 19:37:04      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:存储过程 oracle   authid current_user   

如下一个存储过程是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






权限不足,布布扣,bubuko.com

权限不足

标签:存储过程 oracle   authid current_user   

原文地址:http://blog.csdn.net/karali/article/details/31354695

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!