Oracleの基本
書籍リンク
- リンク
- 読んだ時期
- 2025-04-23 頃
感想
- Oracle 使用時の基本用語が大体 分かるようになる
- SQL のおさらいにも良い
- 実際に運用してメンテナンスするときの勘どころ的な視点でも書かれている(ように見える)
- 何のためにこの機能があるのか、というのが分かる
- オプティマイザ統計情報とか断片化解消とかのくだり
- Oracle の Windows への OTNライセンスでのインストール方法が書かれてる
- 自力で試行錯誤する前に読んでおけば、どの設定が何であるか分かって効率的だったはず
以下はメモ
〜〜〜〜
outer join の oracle 固有記法 (+)
sql
select EMPNO, ENAME, DNAME from EMP e
left outer join DEPT d
on e.DEPTNO = d.DEPTNO
↑
sql
select EMPNO, ENAME, DNAME from EMP e, DEPT d
where e.DEPTNO = d.DEPTNO(+);
同じらしい
(+)
がついている方が必須ということか- 非推奨ということなので、新しくは書かない
- けど、読むときに困るので覚えておく
SQL*Plus コマンド
表示系
sql
set LINESIZE <1行の文字数>
set PAGESIZE <1ページ あたりに表示する行数>
列の表示幅を指定
sql
COLUMN <列名> FORMAT A<バイト数>
日時の表示フォーマットを指定
sql
alter session set NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS'
これは sqlplus コマンドではなく、初期化パラメータという
- DATE型のとき: NLS_DATE_FORMAT
- TIMESTAMP型のとき:NLS_TIMESTAMP_FORMAT
SQLの種類
- DML : Data Manipulation Language
- データの変更
- select / insert / update / delete
- トランザクション制御文
- commit / rollback
- DDL : Data Definition Language
- alter / create / drop / grant / revoke
- truncate も DDL
index について
index 作成
sql
create index <インデックス名> on <テーブル名>(<列名1>,..)
- 検索条件に指定するものを指定する
- 増やしすぎると、データ更新時のインデックス更新の負荷が増える
index を使える検索条件
index を使われる検索条件
- 等価条件 :
COL1 = 100
- 範囲検索 :
COL1 > 100
- LIKEの先頭一致条件 :
COL1 like 'ABC%'
index が使われない検索条件
COL1 != 100
COL1 like '%BC%'
COL1 is null
VIEW について
なぜVIEWが必要か(これは書いてあったことではないがメモに追加用)
- 見る範囲が狭められる
- 影響確認などが楽
- オブジェクト指向のクラスの公開範囲と考え方は一緒
マテリアライズドビューとは?
- select 結果を都度検索せず保持するもの
- VIEW自体の条件が複雑で、かつ同じVIEW何度も使う場合に効率的ということか
制約について
制約の一覧
- not null 制約
- null が無いこと
- check 制約
- 列(または列の組み合わせ) が条件を満たすこと
- unique key 制約(一意制約)
- 重複がないこと
- null可?
- primary key 制約(主キー制約)
- 重複も null も無いこと
- 1テーブルに1つのみ設定可
- not null と両方つけると冗長?またはつける必要がある??
- foreign key 制約(外部キー制約、参照整合制制約)
- 外部TBLのキーと一致すること
外部キー制約の設定のしかた
sql
create table TBL_CHILD(
ID number primary key
, PARENT_ID references TBL_PARENT(ID)
, NAME varchar2(10)
sql
[constarints <制約名>] references <親TBL名>(<キー列名1>,..)
これ設定するのは順番を気にしたりする必要が出てくる? transaction 管理していれば問題ないということ?
重くなりそうではある。 といっても更新時だけか
チェック制約の設定しかた
sql
create table TBL1 (
NAME varchar2(10)
, PRICE number(8) check(PRICE >= 100 and PRICE <= 500))
;
primary key 制約の設定のしかた
1つの場合
sql
create table TBL1 (
ID number primary key
, NAME varchar2(10)
);
複数キーにする場合
sql
create table TBL1 (
FIRST_NAME varchar2(10)
, LAST_NAME varchar2(10)
, primary key (FIRST_NAME, LAST_NAME)
;
シーケンスについて
連番を生成するもの
- 「振り出す」というらしい
- 「払い出す」も同じ?
使いかた
sql
insert into TBL_TEST1
(ID, NAME)
values
(SEQ_TEST1.nextval, 'テスト1')
;
ユーザについて
説明
- ローカルユーザ : 特定の PDB でのみ有効
- 共通ユーザ : CDB 全体で有効
マルチテナント環境の構成例
- データベース全体 :
cdb$root
- PDB(1) :
APP1DB
USER1
- PDB(2) :
APP2DB
USER2
- PDB(3) :
APP3DB
USER1
←APP1DB.USER1
とは別管理
- PDB(1) :
事前作成済みの共通ユーザ(SYS
, SYSTEM
)の有効範囲はデータベース全体(cdb$root
)
create user
sql
create user <ユーザ名> identified by <ぱすわーど>
[default tablespace <デフォルト表領域>]
[temporary tablespace <デフォルト一時表領域>]
[quota <割当てサイズ> on <表領域> ...]
;
- 表領域
- オブジェクト作成時のデフォルトの格納先
- 省略時は
USERS
- 一時表領域
- 大量のデータ処理(ソートなど)を実行する時に使用される領域
- 省略時は
TEMP
- quota
- 指定しないとオブジェクト作成できない?
- 無制限にするには
unlimited
を指定
パスワード変更
sql
alter user <ユーザ> identified by <パスワード>;
Oracle 11g から
- パスワードの有効期限は 180 日
- パスワード大文字/小文字が区別されるようになった
- 無効にするには、初期化パラメータ
SEC_CASE_SENSITIVE_LOGON
をFALSE
に設定する
- 無効にするには、初期化パラメータ
drop user
sql
drop user <ユーザ名> [cascade]
- cascade オプション
- ユーザのオブジェクト(TBLとか)も削除する場合に指定
- 指定しない場合は、あらかじめ各オブジェクトを drop しておく必要あり
他ユーザが所有するオブジェクトへのアクセス
sql
select * from user1.TBL_TEST1
省略すると自分ユーザのオブジェクトにアクセスするが、 別に自分ユーザでも指定するようにしても良い。
オブジェクトは、ユーザ毎の「箱」に格納されているイメージだが、 この、ユーザ毎の箱を「スキーマ」と呼ぶこともある
権限付与
- 権限付与は PDB ごとに独立
権限付与/取り消し
- grant
- revoke
ロール
ユーザ毎ではなく ロール単位で権限付与できる
sql
grant <システム権限> to <ロール>;
revoke <システム権限> from <ロール>;
grant <オブジェクト権限> on <オブジェクト> to <ロール>;
revoke <オブジェクト権限> on <オブジェクト> from <ロール>;
ユーザは ロールに所属させれば良い
sql
grant <ロール> to <ユーザ>;
revoke <ロール> from <ユーザ>;
定義済みロール
- CONNECT
- RESOURCE
- DBA
- DATAPUMP_EXP_FULL_DATABASE
- DATAPUMP_IMP_FULL_DATABASE
システム権限
- CREATE SESSION ← Oracle に接続するために必要
- CREATE TABLE, SEQUENCE, .. etc
付与された権限を他のユーザにも付与できるようにするには?
with grant option
句をつける
サンプルユーザ?
connect stott/tiger@localhost:1521/orclpdb
id/pw
- scott/tiger
- sh/sh ← これも?
共通ユーザへの権限付与
sql
grant <権限/ロール> to <共通ユーザ> container=all;
grant <権限/ロール> to <共通ユーザ> container=current;
共通ユーザはcdb$root
単位でのユーザのこと(=PDB単位ではなく)
表領域
表領域とは
複数のデータファイルを束ねた、オブジェクトにデータ格納用領域を割り当てるための「仮想的な箱」のようなもの
表領域の作成
sql
create tablespace <表領域名>
datafile '<データファイルのパス>' size <サイズ> [reuse] [autoextend on]
, datafile '<データファイルのパス>' size <サイズ> [reuse] [autoextend on]
;
↑ 複数ファイルある場合は、このように複数指定
表領域の削除
sql
drop tablespace <表領域名> [including contents [and datafiles]];
- including contents : 格納されたオブジェクトも消す
- and datafiles : データファイルも消す
データファイル残して drop して、再利用できたりするんだろうか・・?
テーブル作成時に表領域を指定する方法
sql
create table (
...
) tablespace <表領域名>
;
ユーザのデフォルト表領域を確認する方法
sql
select DEFAULT_TABLESPACE from DBA_USERS where USERNAME = '<ユーザ名>';
データディクショナリビュー
- DBA_USERS
- V$PARAMETER
いったんスキップした章
- 5.1. テーブル設計
- 物理設計
運用系
アーカイブログモードとは
リカバリ機能のために変更履歴(REDOログ)を残す仕組み
データベースの変化と必要なメンテナンスの作業
- データ量の変化にともなうオプティマイザ統計情報の再収集
- データ変更にともなうテーブルの断片化の解消
- 動作環境の変化に追従するために初期化パラメータ変更