web-dev-qa-db-ja.com

OracleはユーザーにUSERSテーブルスペースの使用を制限します

スキーマ「TEST」があり、そのスキーマには独自のテーブルスペース「TEST」があります。しかし、USERSテーブルスペースにインデックスを作成すると、作成されました。 OracleデータベースでUSERSテーブルスペースの使用を制限するにはどうすればよいですか?

CREATE UNIQUE INDEX "TEST"."INDEX1" ON "TEST"."TESTTABLE" ("TESTNO") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
TABLESPACE "USERS"

成功しました。TESTユーザーがUSERSテーブルスペースにオブジェクトを作成できないようにしたいと思います。独自のTESTテーブルスペースがあります。設定はありますか?ユーザーはTABLESPACE "USERS"ではなくTABLESPACE "TEST"を使用する必要がありますか?

2

ユーザーTESTUNLIMITED TABLESPACE特権、またはUSERSテーブルスペースで定義された割り当て。それらを取り消すには:

revoke unlimited tablespace from test;
alter user test quota 0 on users;

ユーザーがUNLIMITED TABLESPACE権限が割り当てられていない場合、ユーザーはTESTテーブルスペースに割り当てを定義する必要があります。これにより、ユーザーは上記のコマンドの後に再び使用できるようになります。

alter user test quota unlimited on test;
6
Balazs Papp

Balazsの答えの+1とシナリオをここで共有したい。

RESOURCEロールを任意のユーザーに付与すると、ユーザーはUNLIMITED TABLESPACE特権(12cより前)を取得し、任意のテーブルスペースでオブジェクトを作成できるようになります。 USERSユーザーからCREATE TABLE特権を取り消した後でも、TESTテーブルスペースにインデックス(UNLIMITED TABLESPACE権限があります)を作成できますが、データを挿入できないため、それを行うには割り当てが必要です。

ここにデモがあります:

SQL> create tablespace test_tbs datafile '/u01/app/Oracle/oradata/orcl/test_tbs.dbf' size 50M;

Tablespace created.

SQL> create user test identified by test default tablespace test_tbs quota unlimited on test_tbs;

User created.



SQL> grant create session, resource to test;

Grant succeeded.

SQL> conn test/test
Connected.
SQL> create table testtable(testno number);

Table created.

SQL> CREATE UNIQUE INDEX "TEST"."INDEX1" ON "TEST"."TESTTABLE" ("TESTNO") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
TABLESPACE "USERS";  2    3    4    5    6  

Index created.

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

10 rows selected.

SQL> conn / as sysdba
Connected.
SQL> revoke unlimited tablespace from test;

Revoke succeeded.

SQL> alter user test quota 0 on users;     

User altered.

SQL> conn test/test  
Connected.
SQL> drop index index1;

Index dropped.

SQL> CREATE UNIQUE INDEX "TEST"."INDEX1" ON "TEST"."TESTTABLE" ("TESTNO") 
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
TABLESPACE "USERS";  2    3    4    5    6  

Index created.

SQL> insert into testtable values(1);
insert into testtable values(1)
            *
ERROR at line 1:
ORA-01950: no privileges on tablespace 'TEST_TBS'


SQL> conn / as sysdba
Connected.
SQL> alter user test quota unlimited on test_tbs;

User altered.

SQL> conn test/test
Connected.


SQL> insert into testtable values(1);
insert into testtable values(1)
            *
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'
1
JSapkota