在 Oracle 中,如果使用 CTAS 查询,是否可以使用相同的组创建新的 table?

In Oracle, Can you create a new table with the same groups if you use CTAS Query?

我使用查询 CTAS 创建一个新的 table,然而,当 CTAS 完成后,其他用户无法 select 新的 table,但他们可以访问旧的,是否可以将所有用户和组传递给新的table?因为旧的 table 将被删除。

“一种方法”是向所有这些用户授予(至少)select 权限。

如果您使用了一个角色并授予该角色 select 权限,然后将角色授予这些用户,事情会变得非常简单 - 只需授予新 [=37] 的 select 权限=]到同一个角色,大家都会“看到”。

否则,您可以编写查询来为您创建那些 grant 语句。

例如,在 Scott 的架构中有 EMP table。我之前已将权限授予我数据库中的其他用户,现在我将创建一个“新”CTAS table 并将权限授予同一组用户。

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;

现在只需 copy/paste 上述一堆 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>

如果有 zillion 用户,PL/SQL 选项会更简单,因为它会为您做所有事情(即没有 copy/pasting):

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>

如果您使用 CTAS 从现有的创建一个 table,新的是一个新的段,因此它缺少权限。您需要恢复授予旧 table 的权限并授予新权限。为此,您可以使用多种替代方案( dbms_metadata、动态 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 table 生成授权语句列表。那么你只需要运行赠款列表

正如我所说,有多种选择可以做到这一点。

此致