权限不足

权限不足

大家好,又见面了,我是全栈君。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116452.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号