在 Oracle 中对新创建的 table 授予删除权限
Grant delete on newly created table in Oracle
脚本必须 运行 作为用户 A。
此脚本创建一个 table B.temptable 。
然后脚本必须从 B.temptable 中删除。
这会产生错误 ORA-01031:Insufficient privileges。
我如何授予用户 A 权限以从这个新创建的 table 和用户 B 架构中的任何其他 table 中删除行?
我的首选解决方案包含一个(授予?)语句,用户 C 可以 运行 使用户 A 能够从用户 B 的任何 table 中删除记录。
详情:
用户A拥有create any table权限和drop table权限。
用户 B 是一个 'temp' 模式,其他用户也使用它来存储用于在其他模式中执行其他数据处理的数据。
用户 C 授予用户 A 架构权限,用户 C 是对所有架构具有权限的管理员用户。
table 使用以下语句创建(列和 table 名称混淆):
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;
然后我会批量处理table中的行,处理完后删除
B
拥有 table,因此 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
可以拥有一个从 table 中动态删除的过程,并像上面那样将 execute
授予 A
,这样 A
可以请求 B
执行删除。
None这个是特别安全的,但是这个需求好像要求的东西不安全。
正如@AlexPoole 所说,此问题的正确解决方案是停止删除并重新创建永久 table,并改用全局临时 Table。但是,这似乎不是一个选项 "because of conventions that are made in our team".
另一种解决方案是通过向 CREATE TABLE B.temptable AS SELECT * FROM ...语句。
如果您想要的是没有行的 table,请使用 WHERE 子句,其中 returns 一个空集:
CREATE TABLE B.temptable AS SELECT * FROM whatever
where 1 = 2
/
这避免了在 B.temptable
上授予 DELETE 的问题。当然,它并没有解决 INSERT 记录或查询 table 的权限问题。
声明
Grant delete any table to A
可以 运行 作为用户 C 授予 A 从任何架构中的任何 table 中删除的权利。
没有将删除权限限制为只有一个 user/schema.
的授权语句
脚本必须 运行 作为用户 A。 此脚本创建一个 table B.temptable 。 然后脚本必须从 B.temptable 中删除。 这会产生错误 ORA-01031:Insufficient privileges。 我如何授予用户 A 权限以从这个新创建的 table 和用户 B 架构中的任何其他 table 中删除行?
我的首选解决方案包含一个(授予?)语句,用户 C 可以 运行 使用户 A 能够从用户 B 的任何 table 中删除记录。
详情:
用户A拥有create any table权限和drop table权限。 用户 B 是一个 'temp' 模式,其他用户也使用它来存储用于在其他模式中执行其他数据处理的数据。 用户 C 授予用户 A 架构权限,用户 C 是对所有架构具有权限的管理员用户。
table 使用以下语句创建(列和 table 名称混淆):
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;
然后我会批量处理table中的行,处理完后删除
B
拥有 table,因此 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
可以拥有一个从 table 中动态删除的过程,并像上面那样将 execute
授予 A
,这样 A
可以请求 B
执行删除。
None这个是特别安全的,但是这个需求好像要求的东西不安全。
正如@AlexPoole 所说,此问题的正确解决方案是停止删除并重新创建永久 table,并改用全局临时 Table。但是,这似乎不是一个选项 "because of conventions that are made in our team".
另一种解决方案是通过向 CREATE TABLE B.temptable AS SELECT * FROM ...语句。
如果您想要的是没有行的 table,请使用 WHERE 子句,其中 returns 一个空集:
CREATE TABLE B.temptable AS SELECT * FROM whatever
where 1 = 2
/
这避免了在 B.temptable
上授予 DELETE 的问题。当然,它并没有解决 INSERT 记录或查询 table 的权限问题。
声明
Grant delete any table to A
可以 运行 作为用户 C 授予 A 从任何架构中的任何 table 中删除的权利。 没有将删除权限限制为只有一个 user/schema.
的授权语句