授予对Oracle中新创建的表的删除

时间:2018-08-15 08:44:00

标签: oracle permissions grant

脚本必须以用户A的身份运行。 该脚本创建表B.temptable。 然后该脚本必须从B.temptable中删除。 这给出了错误ORA-01031:权限不足。 如何授予用户A权限从该新创建的表以及用户B架构中的任何其他表中删除行?

我的首选解决方案由(授予?)语句组成,可由用户C运行,以使用户A能够从用户B的任何表中删除记录。

详细信息:

用户A具有创建任何表权限以及删除表权限。 用户B是“临时”模式,其他用户也使用它来存储数据,该数据用于执行其他模式中其他数据的处理。 用户C被用户C授予对模式的权限,该用户C是具有所有模式权限的管理员用户。

使用以下语句创建表(混淆了列和表名):

create table tmp_schemaB.mytemptable as
select cola, colb, colc from
(
    select s.*,
        ROW_NUMBER() OVER (PARTITION BY cola order by colb) rn
    from schemaA.myorgtable s
)
where rn=1;

然后,我将批量处理表中的行,并在处理后将其删除。

3 个答案:

答案 0 :(得分:3)

@AlexPoole表示,解决此问题的正确方法是停止删除并重新创建永久表,而改用Global Temporary Table。但是,“由于我们团队中的约定”,这似乎不是一种选择。

另一种解决方案是通过在CREATE TABLE B.temptable AS SELECT * FROM ...语句中添加WHERE子句,仅使用实际需要的行来创建非临时表。

如果您想要的是没有行的表,请使用WHERE子句,该子句将返回空集:

message.set(FIX::PreviouslyReported(false));

这避免了在CREATE TABLE B.temptable AS SELECT * FROM whatever where 1 = 2 / 上授予DELETE的问题。当然,它不能解决INSERT记录或查询表的特权问题。

答案 1 :(得分:2)

B拥有该表,因此B或具有DBA特权的用户必须将其权限授予A

也许B可以拥有执行授予的定义者权限过程,并向A授予对该过程的执行权限。

create or replace procedure grant_delete
    ( p_table user_tables.table_name%type
    , p_grantee user_users.username%type )
as
begin
    -- Filtering here (e.g. temp tables only, name matches some pattern etc, else fail)
    -- Log the request

    execute immediate 'grant delete on '||p_table||' to '||p_grantee;
end grant_delete;
/

grant execute on grant_select to A;

或者,B可以拥有一个过程,该过程可以动态地从表中删除,并像上面一样,将execute授予A,以便A可以请求B执行删除操作。

这都不是特别安全的,但此要求似乎要求不安全。

答案 2 :(得分:0)

声明

Grant delete any table to A
可以以用户C的身份运行

,以赋予A从任何模式中的任何表中删除的权利。 没有授予语句将删除权限限制为仅一个用户/模式。