ORACLE - 已授予创建过程但无法创建过程

Posted

技术标签:

【中文标题】ORACLE - 已授予创建过程但无法创建过程【英文标题】:ORACLE - Create Procedure granted but can't create procedure 【发布时间】:2012-05-05 11:09:38 【问题描述】:

数据库中有一个用户被授予 CREATE PROCEDURE 特权。但是当该用户尝试创建一个简单的过程时,会抛出以下错误:ORA-01031:权限不足 01031. 00000 - “权限不足” *原因:试图更改当前用户名或密码 没有适当的特权。如果出现此错误,也会发生 试图在没有必要操作的情况下安装数据库 系统权限。

这是该过程的 DDL:

 CREATE OR REPLACE PROCEDURE TOTALBASE.ROUNDUP 
          (CUR OUT SYS_REFCURSOR  ) 
 AS 
 BEGIN
  OPEN CUR FOR
   SELECT * FROM TOTALBASE.ABONENT; 
 END ROUNDUP;

我还应该考虑做些什么来完成这项工作?我怀疑即使授予特权,任何不在管理员或 ORA_DBA 组中的人也无法创建过程。但我不确定。

【问题讨论】:

您在尝试创建此过程时是否在totalbase 架构中?看起来好像您正在尝试将来自不同用户的对象添加到 totalbase... 不,我在不同的架构中。但我已授予该用户 CREATE PROCEDURE 特权。这还不够吗? 该用户是否也对 abonent 表具有 SELECT 权限? 【参考方案1】:

要在您自己以外的架构中创建过程,您需要CREATE ANY PROCEDURE 权限。

作为一般规则,不应轻易授予此权限,因为它很容易被用来规避数据库安全性。

希望对您有所帮助。

【讨论】:

相信我,我也授予了该特权,但我遇到了同样的问题。然后我在看到它无论如何都没有帮助后撤销了该特权。 那么我建议你重新授予 CREATE ANY PROCEDURE 权限,然后再试一次,使用 'alter session set sql_trace = true;'看看发生了什么。【参考方案2】:

在下面几个cmets之后,我再试一次。

不要在另一个模式中创建过程;只让每个用户在自己的模式中创建对象。

这样你就没有理由GRANT 访问其他模式对象了。然后TOTALBASE 用户可以将该过程的EXECUTE 权限授予当前用户。

当前用户需要TOTALUSER表中的一些数据,当他对函数或过程具有EXECUTE权限时,不需要创建或访问其他对象。

从另一个角度看,这种方式也更容易维护:TOTALUSER 提供了一种 API,用于向当前用户公开数据,隐藏未来可能更改的实现细节,对当前用户透明。

【讨论】:

-1。正如问题和下面的 cmets 中所解释的,这与 OP 试图做的相反。 在 99%+ 的情况下,他试图做的事情都不好。他问什么!=他需要做什么。这是非常危险的。作为一般准则,避免对其他模式进行任何授权(授权包含 ANY 关键字)。即使是像授予 SELECT 这样看起来良性的事情,认为它是只读的,也会产生意想不到的效果(比如 select ... for update ) 我明白这一点,如果您编辑您的答案以包含问题的解决方案以及对为什么该解决方案错误以及应该做什么的明确解释,我将反转否决票,取决于我对您的回答的同意程度,也可能会投赞成票。看看@Mark 的回答,他回答了这个问题,然后说可能不应该这样做,为什么。就目前而言,尽管您的回答并没有真正帮助。 OP 知道他们可以在同一架构中创建过程。

以上是关于ORACLE - 已授予创建过程但无法创建过程的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程基本语法

Oracle 创建存储过程 提示权限不足或者提示表和视图不存在问题

如何在 Oracle SQL 开发人员中查看/执行授予的存储过程

Oracle数据库—— 存储过程与函数的创建

向角色授予 MANAGE GRANTS

Oracle 10gR2过程中调用其他模式过程的权限