首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle: ORA-01031:权限不足

Oracle: ORA-01031:权限不足
EN

Stack Overflow用户
提问于 2020-07-30 22:38:55
回答 3查看 510关注 0票数 0

我尝试使用存储过程将数据从一个表插入到另一个表中,如下所示:

代码语言:javascript
复制
create or replace Procedure SP_PE_MIG_PT021

AS

BEGIN

savepoint inicio;

--Insersión de datos de seis meses atrás a la fecha actual

insert into tmptbl_fr59pt021
select * from (select * from crpdta.f59pt021 where jde_date(PT59DTPT) <= (select add_months(To_date(current_date),-6) from dual)
and trim(PTIDPTPY) = '0010490'
)
;

insert into crpdta.F59PT021_HTR
select * from tmptbl_fr59pt021;

--Eliminar datos de la tabla origen

delete from crpdta.f59pt021 where jde_date(PT59DTPT) <= (select add_months(To_date(current_date),-6) from dual)
and trim(PTIDPTPY) = '0010490';

commit;

end SP_PE_MIG_PT021;

表tmptbl_fr59pt021是一个临时表。我有这个错误:ORA-01031: insufficient privileges

但是当我在存储过程之外的这个表中执行insert操作时,可以无缝地插入数据。

如何修复此错误?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2020-07-30 22:43:20

在PL/SQL块(即过程)中,您只拥有被直接给您的特权。由角色(例如DBA)授予的权限不适用于过程。

代码语言:javascript
复制
GRANT INSERT, DELETE, UPDATE ON tmptbl_fr59pt021 TO ...

或者类似的。

票数 2
EN

Stack Overflow用户

发布于 2020-07-30 22:59:29

选项A

我们将运行过程的用户称为usera (您没有指定它),表的所有者是crpdta。我猜该过程的所有者也是表tmptbl_fr59pt021的所有者。

PL/SQL权限仅在直接授予时才起作用,而不是由角色授予。因此,您至少需要以下内容

代码语言:javascript
复制
grant select,insert,delete,update on crpdta.f59pt021 to usera;

选项B

另一种选择是在过程中使用AUTHID子句,该子句指示Oracle是使用调用者的权限(CURRENT_USER)还是所有者权限(DEFINER)运行例程。如果未指定该子句,Oracle将默认使用AUTHID定义器。在本例中,Oracle使用过程所有者的权限运行过程。

在您的示例中,您可以按如下方式更改过程

代码语言:javascript
复制
create or replace Procedure SP_PE_MIG_PT021 authid current_user

AS

BEGIN

savepoint inicio;

--Insersión de datos de seis meses atrás a la fecha actual

insert into tmptbl_fr59pt021
select * from (select * from crpdta.f59pt021 where jde_date(PT59DTPT) <= (select add_months(To_date(current_date),-6) from dual)
and trim(PTIDPTPY) = '0010490'
)
;

insert into crpdta.F59PT021_HTR
select * from tmptbl_fr59pt021;

--Eliminar datos de la tabla origen

delete from crpdta.f59pt021 where jde_date(PT59DTPT) <= (select add_months(To_date(current_date),-6) from dual)
and trim(PTIDPTPY) = '0010490';

commit;

end SP_PE_MIG_PT021;

在这种情况下,只要crpdta拥有对过程的执行权限,并且拥有对表tmptbl_fr59pt021的读/写权限,您就不需要在crpdta拥有的表中授予另一个用户( usera )任何DML权限。这是一种不同的方式,在你的情况下,我不认为我会使用它。

但是,在您有一个过程供许多用户使用场景中,所有这些用户都插入到自己的表中。您不想复制代码,您可以将AUTHID设置为CURRENT_USER,该过程将以调用者的权限执行

票数 0
EN

Stack Overflow用户

发布于 2020-07-31 15:07:34

在使用存储过程插入到表中时,您需要直接权限,而不是通过角色,在本例中,您可以在过程之外插入到Oracle表中,因为您可以通过tmptbl_fr59pt021角色进行访问。

您可以通过说Set role none来确认这一点;然后尝试insert语句,如果您通过角色拥有访问权限,则该语句将失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63175535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档