小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Oracle 12cでユーザ登録からテーブル作成までをやってみた。

f:id:replication:20150803075544j:plain

はじめに

Oracle Database 12cをインストールして、テーブル作成、ユーザ登録、データの取得までをやってみました。

機能で学ぶOracle Datebase入門 (DB Selection)
一志 達也
翔泳社
売り上げランキング: 351,551

環境
  • Windows Server 2012
  • Oracle Database 12c R1(12.1.0.1.0)
テーブルの作成

はじめに、サンプルで使用するテーブルを作成します。

1.sysユーザでログインします。

connect / as sysdba

2.create table文を実行して、テーブルを作成します。

create table table01
(
  id number,
  name varchar(50),
  furigana varchar(50),
  birthday varchar(8),
  timestamp timestamp(6),
  primary key( id )
);

3.試しに以下のSQLを実行して、データ件数を取得してみます。まだデータを挿入していないので、件数0が取得できます。

select count(id) from table01;

 COUNT(ID)
----------
         0
テーブルを操作するためのユーザを作成する

sysユーザでもtable01テーブルを操作できるのですが、通常はテーブルを操作するための専用ユーザを作成し、必要な権限のみを与えます。
1.create user文を実行して、あたらしくユーザを作成します。

-- CREATE USER ユーザ名 IDENTIFIED BY パスワード;
CREATE USER hoge IDENTIFIED BY hoge_pwd;

あれ、create user文が「ORA-65096: 共通ユーザーまたはロール名が無効です」のエラーになってしまいました。

CREATE USER hoge IDENTIFIED BY hoge_pwd
            *
行1でエラーが発生しました。:
ORA-65096: 共通ユーザーまたはロール名が無効です

調べたところ、ルートコンテナにローカルユーザーを作成しようとした場合に発生するエラーでした。

接続しているコンテナを調べて、CDB$ROOTとなっていた場合はルートコンテナに接続している状態です。

SQL> show con_name;

CON_NAME
------------------------------
CDB$ROOT

以下のクエリを実行し、PDBの名前とopen_modeがREAD WRITEとなっているかを確認します。

select name, open_mode from v$pdbs;

READ WRITEモードになっていない場合は、プラガブルデータベースを起動します。

alter pluggable database pdbの名前 open;

次のクエリを実行し、現在のコンテナをプラガブルデータベースに変更します。

alter session set container = pdbの名前;

あらためて、create user文を実行して、あたらしくユーザを作成します。

-- CREATE USER ユーザ名 IDENTIFIED BY パスワード;
CREATE USER hoge IDENTIFIED BY hoge_pwd;

2.作成したhogeユーザは、この状態だとログインすらできないので、ログインする権限を与えます。

GRANT CONNECT TO hoge;

3.hogeユーザにさきほど作成したtable01テーブルへの操作権限を与えます。これでhogeユーザはtable01テーブルに対してデータの検索、挿入、更新、削除ができるようになります。

GRANT select,insert,update,delete ON table01 TO hoge;
一般ユーザでテーブルを操作する

1.hogeユーザでログインしなおします。(PDBORCLはプラガブルデータベースの名前です)

conn hoge/hoge_pwd@PDBORCL

2.table01テーブルの件数を取得してみる

select count(id) from table01;
>select count(id) from table01
>                      *
>行1でエラーが発生しました。:
>ORA-00942: 表またはビューが存在しません。

table01というテーブルが見つからないため、ORA-00942のエラーになりました。table01はsysユーザで作成したテーブルなので、以下のようにします。

select count(id) from sys.table01;

 COUNT(ID)
----------
         0
テーブルに別名を与えるシノニム

テーブル名を指定するのに、テーブル作成者を意識しないと使えないのは非常に不便です。そのため、シノニムという機能を使います。シノニムとは、オブジェクトに別の名前を付けて、その名前で使えるようにする機能のことです。

connect sys/password@pdborcl as sysdba
create public synonym table01 for sys.table01;
>シノニムが作成されました。

この状態で、再度さきほどのSQLを流すとシノニムを介して、目的のテーブルを操作することができます。

SQL> conn hoge/hoge_pwd@PDBORCL
接続されました。
SQL> select count(id) from table01;

 COUNT(ID)
----------
         0