よく使うOracle8iのコマンドをメモ。Oracle10iでもほぼ同じ。
【SQL*Plus編】
■シェルからSQL/PLUSを使う
$ sqlplus /nolog
■ログインする
conn / as sysdba
conn sys/change_on_install
conn system/manager
conn suzuki/xxx
conn tanaka
データベース管理者ユーザー
- SYSユーザー:管理に重要なデータ・ディクショナリを所有している。
- SYSTEMユーザー:管理情報が含まれる表やビューを所有している。
セキュリティの理由からSYSユーザーとSYSTEMユーザーの初期パスワードは、早めに変更しましょ。
【Oracle管理編】
管理の作業は、管理者でログインして行う。
$ sqlplus /nolog
SQL> conn system/manager
■表領域とデータ・ファイル情報の取得
SELECT file_name, tablespace_name
FROM dba_data_files;
■ユーザーのデフォルト表領域
SELECT username, default_tablespace
FROM dba_users;
■ユーザーの一覧
SQL> SELECT username, default_tablespace
2 FROM dba_users;
■ユーザー作成
CREATE USER suzuki
IDENTIFIED BY xxxxxx
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA unlimited ON users;
QUOTAを必ず付ける。QUOTA 15m ON usersなど。
後から変更もできる。
ALTER USER suzuki QUOTA unlimited on temp;
ALTER USER suzuki QUOTA unlimited on rbs;
■ユーザー作成後に権限の付与(ロールを与える。ざっくりと指定。)
GRANT connect, resource TO suzuki;
これを付与しないと、せっかくユーザを作ってもログインさえできない。
■ユーザー作成後に権限の付与(システム権限を与える。細かく指定。)
アプリケーション開発者向けの場合、
SQL> GRANT CREATE SESSION, CREATE TABLE,
2 CREATE SEQUENCE, CREATE VIEW, CREATE PROCEDURE
3 TO suzuki;
■権限の確認
SELECT * FROM session_privs;
自分が持っている権限を確認できる。
■ユーザーの削除
DROP USER suzuki;
ユーザーの所有するスキーマ・オブジェクトも一緒に削除
DROP USER suzuki CASCADE;
注意:接続しているユーザーがいたらダメ。
■誰が何のプロファイルを使用しているか
SELECT username, profile
FROM dba_users;
■テーブル作成
CREATE TABLE emp
(id number,
last_name varchar2(100));
■既存のテーブルから新しいテーブルを作成
部署の番号が20のものを拾って、新しいemp表を作る。
CREATE TABLE new_emp AS
SELECT * FROM emp
WHERE deptno = 20;
■テーブル一覧
SELECT * FROM tab;
よく使う。手クセになるコマンドのひとつ。
まず、これで手持ちのテーブルを一覧して、次に列の一覧でフィールド名を確認する。
■列の一覧
DESC emp;
これも手クセになるはず。
■列の追加
ALTER TABLE emp
ADD (first_name varchar2(10));
列の一覧で確認し、足りないフィールドがあったらこれで足していく。
■列の削除
ALTER TABLE emp
DROP (first_name);
■列の変更
ALTER TABLE emp
MODIFY (first_name varchar2(30));
■一意キーの作成
ALTER TABLE emp
ADD CONSTRAINT id_pk PRIMARY KEY(id);
■順序(主キー値)の作成
CREATE SEQUENCE emp_id_seq
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
■順序(主キー値)の確認
SELECT sequence_name, last_number
FROM user_sequences;
【Oracle SQL編】
■日付で検索する
SELECT id, name FROM emp
WHERE birthday = TO_DATE( '1980/09/28' , 'YYYY/MM/DD' ) ;
SELECT id, name FROM emp
WHERE TO_CHAR( birthday, 'YYYYMMDD' ) = '1980/09/28' ;
■期間で検索する
SELECT id, name FROM emp
WHERE birthday >= TO_DATE( '1980/09/28' , 'YYYY/MM/DD' )
AND birthday < TO_DATE( '1981/09/28' , 'YYYY/MM/DD' ) ;
■インサート文
INSERT INTO emp
(id, name)
VALUES
( 3, '高橋' );
順序を使うとき、
INSERT INTO emp
(id, name)
VALUES
( emp_seq.nextval, '高橋' );
■データの修正
日付を一括変更。ついでにメモ欄を空にする。
UPDATE emp
SET
modify_date = TO_DATE('2004/12/16', 'YYYY/MM/DD') ,
memo = NULL ;
■データの修正
'Sales' を 'SALE' に変更。
SQL> UPDATE emp
2 SET
3 dept = 'SALE'
4 WHERE dept = 'Sales';
■文字列を数値に変換
'00123'という文字列は、数字の123に変換したい。
SQL> UPDATE emp
2 SET
3 num_no = to_number( str_no );
■数値を文字列に変換
数字の123を文字列の'123'に変換したい。
SQL> UPDATE emp
2 SET
3 str_no = to_char( num_no );
■行を削除する
SQL> DELETE FROM emp
2 WHERE id = 300;
【Oracle エラー編】
■インサート文でエラー
ORA-01552: SYSTEM表領域でない表領域:
USERSにシステム・ロールバック・セグメントは使用できません。
原因として、ロールバックセグメントがオフラインになっている可能性がある。
SELECT segment_name, status
FROM dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
R01 OFFLINE
R02 OFFLINE
R03 OFFLINE
R04 OFFLINE
STATUSがOFFLINEになっていたので、
/u01/app/oracle/product/8.1.5/dbs/initXXX.oraを編集。
# rollback_segments = (r01, r02, r03, r04)のコメントを外して有効にする。
そして、dbshutでデータベース停止、dbstartでデータベース開始する。
OracleのSQL*Plus便利もの
Oracleのバックアップスクリプト