SQL> create table my_new_table as select * from emp;
Table created.
SQL> select 'grant select on my_new_table to ' || grantee ||';' run_me
2 from all_tab_privs_made
3 where owner = 'SCOTT'
4 and table_name = 'EMP';
RUN_ME
---------------------------------------------------------------
grant select on my_new_table to SYS;
grant select on my_new_table to SUPERUSER;
grant select on my_new_table to MY_ROLE;
grant select on my_new_table to MIKE;
现在只需复制/粘贴上面的一堆 grant 声明:
SQL> grant select on my_new_table to SYS;
Grant succeeded.
SQL> grant select on my_new_table to SUPERUSER;
Grant succeeded.
SQL> grant select on my_new_table to MY_ROLE;
Grant succeeded.
SQL> grant select on my_new_table to MIKE;
Grant succeeded.
SQL>
如果有无数的用户,pl/sql选项会更简单,因为它可以为您做任何事情(即不复制/粘贴):
SQL> begin
2 for cur_r in (select grantee
3 from all_tab_privs_made
4 where owner = 'SCOTT'
5 and table_name = 'EMP'
6 )
7 loop
8 execute immediate 'grant select on my_new_table to ' || cur_r.grantee;
9 end loop;
10 end;
11 /
PL/SQL procedure successfully completed.
SQL>
2条答案
按热度按时间hrirmatl1#
“一种方法”是给予(至少)
select
所有这些用户的特权。如果你使用了一个角色
select
把特权授予那个角色,然后把角色授予那个些用户,事情就简单多了——只需授予select
新表上的特权相同的角色,每个人都会“看到”它。否则,您可以编写查询来创建这些
grant
你的陈述。例如,在scott的模式中
EMP
table。我以前已经将它的特权授予了数据库中的其他用户,现在我将创建一个“新”ctas表,并将特权授予同一组用户。现在只需复制/粘贴上面的一堆
grant
声明:如果有无数的用户,pl/sql选项会更简单,因为它可以为您做任何事情(即不复制/粘贴):
cwxwcias2#
如果使用CTA从现有表创建表,则新表是一个新段,因此它缺少权限。您需要恢复授予旧表和授予新表的权限。为此,您可以使用几种替代方法(dbms\u元数据、动态sql)。
为了这个目的,我会这样做
第一部分是以一种好的格式创建必要的授权列表。第二部分检索授予t1的所有特权,并生成用于运行到t2表的grants语句列表。那么你只需要运行补助金列表
正如我所说,有几种方法可以做到这一点。
当做