スキーマ「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"を使用する必要がありますか?
ユーザーTEST
はUNLIMITED TABLESPACE
特権、またはUSERS
テーブルスペースで定義された割り当て。それらを取り消すには:
revoke unlimited tablespace from test;
alter user test quota 0 on users;
ユーザーがUNLIMITED TABLESPACE
権限が割り当てられていない場合、ユーザーはTEST
テーブルスペースに割り当てを定義する必要があります。これにより、ユーザーは上記のコマンドの後に再び使用できるようになります。
alter user test quota unlimited on test;
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'