sql—在oracle中,如果使用ctas查询,是否可以创建具有相同组的新表?

gwo2fgha  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(483)

我使用查询ctas来创建一个新表,但是,当ctas完成后,其他用户可以´不能选择新表,但他们可以访问旧表,这是一种将所有用户和组传递到新表的方法吗?因为旧表将被删除。

hrirmatl

hrirmatl1#

“一种方法”是给予(至少) select 所有这些用户的特权。
如果你使用了一个角色 select 把特权授予那个角色,然后把角色授予那个些用户,事情就简单多了——只需授予 select 新表上的特权相同的角色,每个人都会“看到”它。
否则,您可以编写查询来创建这些 grant 你的陈述。
例如,在scott的模式中 EMP table。我以前已经将它的特权授予了数据库中的其他用户,现在我将创建一个“新”ctas表,并将特权授予同一组用户。

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>
cwxwcias

cwxwcias2#

如果使用CTA从现有表创建表,则新表是一个新段,因此它缺少权限。您需要恢复授予旧表和授予新表的权限。为此,您可以使用几种替代方法(dbms\u元数据、动态sql)。
为了这个目的,我会这样做

SQL> CREATE TABLE T2 AS SELECT * FROM T1 ;

    SQL> begin
        dbms_metadata.set_transform_param (dbms_metadata.session_transform, 
  'SQLTERMINATOR', true);  
       dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'PRETTY', 
    true);
    end;
    /

    select replace(dbms_metadata.get_dependent_ddl('OBJECT_GRANT', 'T1', 'OWNER_OF_T1' ),'T1','T2') AS ddl
    from   dual;

第一部分是以一种好的格式创建必要的授权列表。第二部分检索授予t1的所有特权,并生成用于运行到t2表的grants语句列表。那么你只需要运行补助金列表
正如我所说,有几种方法可以做到这一点。
当做

相关问题