【问题标题】:Oracle: ORA-01031: insufficient privilegesOracle: ORA-01031: 权限不足
【发布时间】:2020-07-30 14:38:54
【问题描述】:

我正在尝试使用如下存储过程将数据从一个表插入另一个表:

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

但是当我在存储过程之外的这个表中进行插入时 无缝插入数据。

如何解决这个错误?

谢谢!

【问题讨论】:

    标签: oracle


    【解决方案1】:

    在 PL/SQL 块(即过程)内,您只有 直接 授予您的权限。 ROLE 授予的权限(例如DBA)不适用于过程。

    运行

    GRANT INSERT, DELETE, UPDATE ON tmptbl_fr59pt021 TO ...
    

    或类似的。

    【讨论】:

      【解决方案2】:

      选项 A

      我们调用了运行过程 usera 的用户(您没有指定它),表的所有者是 crpdta。我猜这个过程的所有者也是表 tmptbl_fr59pt021 的所有者。

      PL/SQL 权限仅在直接授予而不是由角色授予时才有效。所以你至少需要以下内容

      grant select,insert,delete,update on crpdta.f59pt021 to usera;
      

      选项 B

      另一个选项是在过程中使用 AUTHID 子句,它指示 Oracle 是使用调用者权限 (CURRENT_USER) 还是使用所有者权限 (DEFINER) 来运行例程。如果没有指定子句,Oracle 将默认使用 AUTHID DEFINER。在您的情况下,Oracle 以过程所有者的权限运行该过程。

      在你的情况下,你会改变程序如下

      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 拥有的表中的任何 DML 权限授予另一个用户 ( usera )。这是一种不同的方式,在你的情况下我认为我不会使用。

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

      【讨论】:

        【解决方案3】:

        使用存储过程插入表时,您需要直接权限而不是通过角色,在您的情况下,您可以在过程之外插入 tmptbl_fr59pt021 表,因为您可以通过 Oracle 角色访问。

        您可以通过说 Set Role none 来确认这一点; 然后尝试插入语句,如果您通过角色访问,它将失败。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-30
          • 2017-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-24
          • 2020-12-10
          • 2019-05-29
          相关资源
          最近更新 更多