1

用户已经从多个模式的多个表中创建了带有 select 语句的表语句。我想限制他们读取数据并允许他们在他们的架构中创建空表,其中只有元数据而不是数据。我想在用户访问和角色级别执行此操作。请告诉我我该怎么做?

我尝试让他们对基础表进行读取访问,但用户也可以看到数据。

Create table cust_acct_details 
as 
select * 
from ep_rel.acct a  
inner join ep_dnf.Cust_account ca 
on a.acct_id  = ca.acct_id 

表应该在没有数据的情况下创建。

4

2 回答 2

0

如果您删除用户的所有表空间权限,他们仍然可以创建表,但无法填充它们。

例如,如果你运行这个 PL/SQL 块来撤销一个用户的所有表空间配额:

begin
    for users in
    (
        select 'alter user '||username||' quota 0 on '||tablespace_name v_sql
        from dba_ts_quotas
        where username = 'TEST_USER'
        order by 1
    ) loop
        execute immediate users.v_sql;
    end loop;
end;
/

现在用户可以创建表,但如果他们尝试添加行会出错:

SQL> create table test1(a number);

Table created.

SQL> insert into test1 values(1);
insert into test1 values(1)
            *
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'USERS'

对于元数据,用户始终可以在自己的架构中看到元数据。要允许他们查看其他模式中的元数据,请运行如下授权:

grant select_catalog_role to the_user;

然后,该用户可以在ALL_数据字典视图中查看元数据,或者使用DBMS_METADATA.GET_DDL.

于 2019-09-13T03:55:33.730 回答
0

将以下条件添加到您的代码中

-- condition to add where 1<>1

Create table cust_acct_details 
as 
select * 
from ep_rel.acct a  
inner join ep_dnf.Cust_account ca 
on a.acct_id  = ca.acct_id 
where 1<>1

请确保您的 select 语句中有唯一的列名。Oracle 不允许在一个表中使用相同的列名。请使用别名而不是 *。

于 2019-09-12T10:09:38.603 回答