web-dev-qa-db-ja.com

Oracle 11gで複数のユーザー/スキーマを接続する方法

私はデータベースのほとんど新しいユーザーなので、何か間違っていると思います。

  • データベースを作成しました。
  • 私は3人のユーザーを作成しました。1人は管理者で、2人は単なるユーザーです。
  • 2つの役割を作成しました。1つは管理者用で、2つは他のユーザー用です。

OracleのスキーマがSQL Serverと異なることを学習しています。 SQL Serverで、スキーマに割り当てられたテーブルを作成しました。例:CREATE TABLE schema1.table1そして、そのDBに割り当てられたユーザーですべてを見ることができました。 Oracleでは、スキーマはユーザーが持っているシーケンス、シノニムなどの合計だと思います。 (そうでない場合は、修正してください)

Oracleでそれを実現したいので、ユーザー/スキーマを作成しました。その後、user1に接続し、そのユーザーでテーブルを作成しました。その後、user2と接続して、ユーザーに関連するテーブルを作成しました。

ここで、adminを使用してuser1テーブルとuser2テーブルに関連する変更を作成しようとすると、十分な権限がないと表示されます。

変更しようとしている後:

ALTER TABLE user1.PhoneTable
    ADD (CONSTRAINT C_001 FOREIGN KEY (Status) 
            REFERENCES user2.ClientTable (Status) ON DELETE SET NULL);

これらのユーザーを作成したのは、Phone(user1)に関連するすべてのテーブルを表示したい場合、そのユーザーに接続し、それがすべてである必要があるため、DBに何らかの順序を付けたいからです。

管理者権限:

GRANT 
    CREATE SESSION,
    UNLIMITED TABLESPACE,
    CREATE TABLE,
    DROP ANY TABLE,
    CREATE CLUSTER,
    CREATE SYNONYM,
    CREATE PUBLIC SYNONYM,
    CREATE VIEW,
    CREATE SEQUENCE,
    CREATE DATABASE LINK,
    CREATE PROCEDURE,
    CREATE TRIGGER,
    CREATE MATERIALIZED VIEW,
    CREATE ANY DIRECTORY,
    DROP ANY DIRECTORY,
    CREATE TYPE,
    CREATE LIBRARY,
    CREATE OPERATOR,
    CREATE INDEXTYPE,
    CREATE DIMENSION,
    CREATE ANY CONTEXT,
    SELECT ANY DICTIONARY,
    CREATE JOB,
    ALTER ANY TABLE,
TO myAdmin;

ユーザー権限:

GRANT 
    CREATE session, 
    CREATE table, 
    CREATE view
    CREATE procedure, 
    CREATE synonym,
    ALTER ANY table, 
    ALTER view, 
    ALTER procedure, 
    ALTER synonym,
    DROP table, 
    DROP view, 
    DROP procedure, 
    DROP synonym
TO myUsers;
3
Luis

参照テーブルに対するREFERENCES特権をuser2に付与する必要があります。 ( [〜#〜] grant [〜#〜]テーブル権限セクションを参照してください。これは、役割。ユーザーに直接付与する必要があります。)

ここにデモがあります:

SQL> create user user1 identified by user1;
User created.
SQL> grant create session, create table, unlimited tablespace to user1;
Grant succeeded.

SQL> create user user2 identified by user2;
User created.
SQL> grant create session, create table, unlimited tablespace to user2;
Grant succeeded.

SQL> create table user1.ref_table (id number primary key);
Table created.
SQL> insert into user1.ref_table values (1);
1 row created.
SQL> insert into user1.ref_table values (2);
1 row created.
SQL> commit;
Commit complete.

SQL> grant references on user1.ref_table to user2;
Grant succeeded.

SQL> connect user2/user2;
Connected.
SQL> create table oth_table (thing number, fk number);
Table created.
SQL> alter table oth_table add(constraint fk1 foreign key (fk)
  2      references user1.ref_table on delete set null);
Table altered.

SQL> insert into oth_table values (42, 1);
1 row created.
SQL> insert into oth_table values (256, 2);
1 row created.
SQL> commit;
Commit complete.

SQL> connect user1/user1;
Connected.
SQL> delete from ref_table where id = 1;
1 row deleted.
SQL> commit;
Commit complete.

SQL> connect user2/user2;
Connected.
SQL> select * from oth_table;

     THING     FK
---------- ----------
    42
       256      2

すべての作業をadminで実行する場合は、CREATE ANY INDEX特権が必要ですが、user2へのREFERENCES付与も必要です。

これがどのように機能するかを次に示します。

SQL> create user user1 identified by user1;
User created.
SQL> create user user2 identified by user2;
User created.
SQL> create user admin identified by admin;
User created.

--- Grants
----------------
SQL> grant create session, create table, unlimited tablespace to user1;
Grant succeeded.
SQL> grant create session, create table, unlimited tablespace to user2;
Grant succeeded.
SQL> grant create session, create any table,
  2        create any index, alter any table to admin;
Grant succeeded.

--- Create reference table as admin
----------------
SQL> connect admin/admin
Connected.
SQL> create table user1.ref_table (id number primary key);
Table created.

--- Do the "references" grant
----------------
SQL> connect / as sysdba
Connected.
SQL> grant references on user1.ref_table to user2;
Grant succeeded.

--- Create the second table as admin
----------------
SQL> connect admin/admin
Connected.
SQL> create table user2.oth_table (foo number, bar number);
Table created.

--- Add the constraint
----------------
SQL> alter table user2.oth_table add(constraint fk
  2      foreign key (bar) references user1.ref_table(id)
  3      on delete set null);
Table altered.
5
Mat