在 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 生成授权语句列表。那么你只需要运行赠款列表
正如我所说,有多种选择可以做到这一点。
此致
我使用查询 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 生成授权语句列表。那么你只需要运行赠款列表
正如我所说,有多种选择可以做到这一点。
此致