ラベル SQL勉強 の投稿を表示しています。 すべての投稿を表示
ラベル SQL勉強 の投稿を表示しています。 すべての投稿を表示

2013/08/16

07-03.テーブル【テーブル管理】

■テーブルコラムの管理
 テーブルのコラムは ADD, MODIFY, DROP演算子により管理できる。

■ADD
 テーブルへ新しいコラムを追加

-- VARCHAR2データタイプのaddrコラムをempテーブルへ追加

SQL> ALTER TABLE emp ADD (addr VARCHAR2(50));

表が変更されました。

SQL>


■MODIFIY
 テーブルのコラムを修正及びNOT NULLコラムに変更できる。
 コラムが既にデーターを持っている場合、他のデータータイプに変更できない。

-- enameコラムをVARCHAR2、サイズ50に修正した例

SQL> ALTER TABLE emp MODIFY (ename VARCHAR2(50));

表が変更されました。

SQL> ALTER TABLE emp MODIFY (ename VARCHAR2(50) NOT NULL);

表が変更されました。

SQL>

■DROP
 テーブルコラムを削除またはテーブル制約条件を削除できる。

-- コラムの削除文法
ALTER TABLE table_name DROP COLUMN column_name


-- 制約条件の削除例

SQL> ALTER TABLE emp2 DROP PRIMARY KEY;

表が変更されました。


-- CASCADEと一緒に使用すると外部キーにより参照されている主キーも削除できる。

SQL> ALTER TABLE dept DROP CONSTRAINT dept_pk_depno CASCADE;

表が変更されました。

SQL>


■既存テーブルのコピー
 -既存テーブルを一部及び全て複製するときはサブクエリを持つCREATE TABLEコマンドで簡単にコピーできる。
 -制約条件、トリガー、テーブル権限はコピーできない。
 -制約条件はNOT NULL条件のみコピーできる。

-- テーブル複製文法

CREATE TABLE [schema.]table_name 
 [LOGGING | NOLOGGING]
 [....]
AS
 subquery


-- テーブル複製例
-- empテーブルを複製してemp6テーブルを作成


SQL> SELECT * FROM emp;

     EMPNO ENAME                                              JOB              MGR HIREDATE        SAL       COMM     DEPTNO ADDR
---------- -------------------------------------------------- --------- ---------- -------- ---------- ---------- ---------- ----------
      7369 SMITH                                              CLERK           7902 13-08-13        800                    20
      7499 ALLEN                                              SALESMAN        7698 13-08-13       1600        300         30
      7521 WARD                                               SALESMAN        7698 13-08-13       1250        500         30
      7566 JONES                                              MANAGER         7839 13-08-13       2975                    20
      7654 MARTIN                                             SALESMAN        7698 13-08-13       1250       1400         30
      7698 BLAKE                                              MANAGER         7839 13-08-13       2850                    30
      7782 CLARK                                              MANAGER         7839 13-08-13       2450                    10
      7788 SCOTT                                              ANALYST         7566 13-08-13       3000                    20
      7839 KING                                               PRESIDENT            13-08-13       5000                    10
      7844 TURNER                                             SALESMAN        7698 13-08-13       1500          0         30
      7876 ADAMS                                              CLERK           7788 13-08-13       1100                    20

     EMPNO ENAME                                              JOB              MGR HIREDATE        SAL       COMM     DEPTNO ADDR
---------- -------------------------------------------------- --------- ---------- -------- ---------- ---------- ---------- ----------
      7900 JAMES                                              CLERK           7698 13-08-13        950                    30
      7902 FORD                                               ANALYST         7566 13-08-13       3000                    20
      7934 MILLER                                             CLERK           7782 13-08-13       1300                    10

14行が選択されました。

SQL> SELECT * FROM emp6;
SELECT * FROM emp6
              *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。


SQL> CREATE TABLE emp6
  2  AS SELECT * FROM emp;

表が作成されました。

SQL> SELECT * FROM emp6;

     EMPNO ENAME                                              JOB              MGR HIREDATE        SAL       COMM     DEPTNO ADDR
---------- -------------------------------------------------- --------- ---------- -------- ---------- ---------- ---------- ----------
      7369 SMITH                                              CLERK           7902 13-08-13        800                    20
      7499 ALLEN                                              SALESMAN        7698 13-08-13       1600        300         30
      7521 WARD                                               SALESMAN        7698 13-08-13       1250        500         30
      7566 JONES                                              MANAGER         7839 13-08-13       2975                    20
      7654 MARTIN                                             SALESMAN        7698 13-08-13       1250       1400         30
      7698 BLAKE                                              MANAGER         7839 13-08-13       2850                    30
      7782 CLARK                                              MANAGER         7839 13-08-13       2450                    10
      7788 SCOTT                                              ANALYST         7566 13-08-13       3000                    20
      7839 KING                                               PRESIDENT            13-08-13       5000                    10
      7844 TURNER                                             SALESMAN        7698 13-08-13       1500          0         30
      7876 ADAMS                                              CLERK           7788 13-08-13       1100                    20

     EMPNO ENAME                                              JOB              MGR HIREDATE        SAL       COMM     DEPTNO ADDR
---------- -------------------------------------------------- --------- ---------- -------- ---------- ---------- ---------- ----------
      7900 JAMES                                              CLERK           7698 13-08-13        950                    30
      7902 FORD                                               ANALYST         7566 13-08-13       3000                    20
      7934 MILLER                                             CLERK           7782 13-08-13       1300                    10

14行が選択されました。

SQL>


■テーブルスペース変更
 ORACLE 8iからは ALTER TABLE ~ MOVE TABLESPACEコマンドで簡単にテーブルスペースを変更できる。

--テーブルスペース変更文
ALTER TABLE table_name Move TABLESPACE tablespace_name;

--テーブルスペース変更例
--scottユーザーへ権限付与
SQL> GRANT CREATE TABLESPACE, ALTER TABLESPACE, DROP TABLESPACE TO scott WITH ADMIN OPTION;

権限付与が成功しました。

--scottユーザーで接続
SQL> conn scott/tiger
接続されました。
SQL> show user
ユーザーは"SCOTT"です。

--test01テーブルスペース作成
SQL> CREATE TABLESPACE test01 DATAFILE 'test01.dbf' SIZE 20M;

表領域が作成されました。

--テーブルスペースの変更
SQL> ALTER TABLE emp
  2  MOVE TABLESPACE test01;

表が変更されました。

SQL>


■テーブルのTRUNCATE
 -テーブルをTruncateするとテーブルの安部手の行が削除され、使用された領域が解除される
 -TRUNCATE TABLEはDDLなのでロールバックデーターは作成されない。
 -DELETEコマンドでデーターを削除するとROLL BACKコマンドで復旧できるが、TRUNCATEデーターを削除すると復旧できない。
 -外部キー参照中のテーブルはTRUNCATEできない。
 -TRUNCATEコマンドを使用すると削除トリガーが実行できない。

--TRUNCATE文法

TRUNCATE TABLE [schema.]table_name;


■テーブル削除(DROP TABLE)

--テーブル削除文法
DROP TABLE [schema.]table_name [CASCADE CONSTRAINTS];

--empテーブル削除

SQL> DROP TABLE emp;

表が削除されました。

--CASCADE CONSTRAINTは外部キーにより参照している主キーを含むテーブルの場合
--主キーを参照してる外部キー条件も一緒に削除する。

SQL> DROP TABLE emp CASCADE CONSTRAINT;


2013/08/15

07-02.テーブル【テーブル制約条件(Constraint)】


■制約条件(Constraint)とは?
 制約条件とはテーブルへ不適切なデーターが入力されるのを防ぐため、
 規則を適用しているのと考えればよい。
 テーブル内でデーターの性格を定義するのが制約条件だ。

 -制約条件はデーターの整合性維持のためユーザーが指定するもの
 -すべての制約はDATA DICTIONARYへ保存される。
 -制約はテーブル作成時または作成後ALTERコマンドで定義可能だ。
 -NOT NULL制約条件は必ずコラムレベルのみで定義可能だ。

■NOT NULL条件
 コラムを必須フィールド化する時、定義する。

--NOt NULL制約条件を設定すると、enameコラムには必ずデーターを入力しなければいけない。
--emp_nn_enameを制約条件名と設定した。

SQL> CREATE TABLE emp3(
  2  ename VARCHAR2(20) CONSTRAINT emp_nn_ename NOT NULL );

表が作成されました。


--制約条件はUSER_CONSTRAINTSビューで確認できる。

SQL> SELECT CONSTRAINT_NAME
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME = 'EMP3';

CONSTRAINT_NAME
------------------------------
EMP_NN_ENAME

SQL>



■UNIQUE条件
 同じ値を持つ行(レコード)を許さない。自動でインデックスが指定される。

--deptnoコラムへUNIQUE制約条件を定義

SQL> ALTER TABLE emp2
  2  ADD CONSTRAINT emp2_uk_deptno UNIQUE (deptno);

表が変更されました。


--制約条件を削除

SQL> ALTER TABLE emp2
  2  DROP CONSTRAINT emp2_uk_deptno;

表が変更されました。

SQL>


■CHECK条件
 コラムの値を特定の範囲に制限できる。

--comnコラムへ1~100の値のみ入れるCHECK条件を定義

SQL> ALTER TABLE emp2
  2  ADD CONSTRAINT emp2_ck_comn
  3  CHECK (comn >=1 AND comn <= 100);

表が変更されました。

SQL>


--制約条件の削除

SQL> ALTER TABLE emp2
  2  DROP CONSTRAINT emp2_ck_comn;

表が変更されました。

SQL>


--10000,20000,30000,40000,50000の値のみ入れるCHECK条件を定義

SQL> ALTER TABLE emp2
  2  ADD CONSTRAINT emp2_ck_comn
  3  CHECK (comn IN (10000, 20000, 30000, 40000, 50000));

表が変更されました。

SQL>



■DEFAULT(コラム基本値)指定
 データーを入力しなくても指定された値が基本的に入力される。

--hiredateコラムに値を入力しなくても今日の日付が入る。

SQL> CREATE TABLE emp4(
  2  EMPNO NUMBER CONSTRAINT emp4_pk_empno PRIMARY KEY,
  3  ENAME VARCHAR2(20),
  4  JOB VARCHAR2(40),
  5  MGR NUMBER,
  6  HIREDATE DATE DEFAULT SYSDATE );

表が作成されました。

SQL>


■PRIMARY KEY指定
 -主キーはUNIQUEとNOT NULLの結合と言える。
 -主キーはそのデーター行を代表するコラムの役割を果たし、他テーブルから外部キーとして参照できる。
 -UNIQUE条件同様、主キーを定義すると自動的にINDEXが作られ、その名前は主キー制約条件の名前と同じだ。
 -INDEX検索キーで検索速度を向上させる
  (UNIQUE、PRIMARY KEY作成時、自動的に作成される)


--PRIMARY KEY作成例文

SQL> CREATE TABLE emp5(
  2  empno NUMBER CONSTRAINT emp5_pk_empno PRIMARY KEY );

表が作成されました。

SQL>


--ALTER TABLEコマンドでPRIMARY KEY作成例文

SQL> ALTER TABLE emp2
  2  ADD CONSTRAINT emp2_pk_empno  PRIMARY KEY (empno) ;


■FOREIGN KEY(外部キー)指定
 -主キーを参照するコラムまたはコラムの集まり。
 -外部キーを持つコラムのデーター形は外部キーが参照する主キーのコラムとデーター形と一致しなければならない。
 -外部キーにより参照する主キーは削除できない。
 -ON DELETE CASCADEで定義された外部キーのデーターはその主キーが削除される時一緒に削除される。

--deptテーブルのdeptnoコラムを主キーに設定する。

SQL> ALTER TABLE dept
  2  ADD CONSTRAINT dept_pk_depno PRIMARY KEY (deptno);

表が変更されました。


--empテーブルのdeptnoコラムがdeptテーブルのdeptnoコラムを参照する外部キーを作成

SQL> ALTER TABLE emp2 ADD CONSTRAINT emp2_fk_deptno
  2  FOREIGN KEY (deptno)  REFERENCES dept(deptno);

表が変更されました。

SQL>


■制約条件の確認
 -USER_CONS_COLUMNS : コラムに設定された制約条件確認
 -USER_CONSTRAINTS : ユーザーが持つすべての制約条件確認

SQL> SELECT SUBSTR(A.COLUMN_NAME,1,15) COLUMN_NAME,
  2  DECODE(B.CONSTRAINT_TYPE,
  3  'P','PRIMARY KEY',
  4  'U','UNIQUE KEY',
  5  'C','CHECK OR NOT NULL',
  6  'R','FOREIGN KEY') CONSTRAINT_TYPE,
  7  A.CONSTRAINT_NAME
  8  FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
  9  WHERE A.TABLE_NAME = UPPER('&table_name')
 10  AND A.TABLE_NAME = B.TABLE_NAME
 11  AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
 12  ORDER BY 1;


--テーブル名を入力する

table_nameに値を入力してください: emp2
旧   9: WHERE A.TABLE_NAME = UPPER('&table_name')
新   9: WHERE A.TABLE_NAME = UPPER('emp2')

COLUMN_NAME                    CONSTRAINT_TYPE   CONSTRAINT_NAME
------------------------------ ----------------- ------------------------------
COMN                           CHECK OR NOT NULL EMP2_CK_COMN
DEPTNO                         FOREIGN KEY       EMP2_FK_DEPTNO
EMPNO                          PRIMARY KEY       EMP_PK_EMPNO

SQL>

07-01.テーブル【テーブル(TABLE)作成】

■テーブルとは?
 テーブルは実際にデーターが保存される場所でCREATE TABLEコマンドで作成できる。

 -テーブルはデーターベースの基本データー保存単位
 -データーベースはユーザーがアクセス可能なすべてのデーターを保有し、レコードとコラムで構成されている
 -テーブルはシステム内で独立的に使用されたいエンティティを表現できる。
  例えば、会社で社員や製品に関するオーダーはテーブルで表現可能だ
 -テーブルはエンティティ間の関係を表現できる、
  つまり、テーブルは社員と作業スキルまたは製品と注文との関係を表現するのに使用できる。
 -テーブル内の外部キー(Forelgn Key)はエンティティ間の関係を表す。
 -コラム:テーブルの各コラムはエンティティの属性を表す。
 -行(ROW,レコード):テーブルのデーターは行に保存される。

※テーブル作成時の制限と注意点
 -テーブル名とコラムは英文字で始まりA~Zの文字、0~9の数字、$,#,_(under bar)を使用できる。(空白使用不可)
 -テーブルコラム名は30文字以内、予約語は使用不可
 -オラクルテーブル1アカウント内でテーブル名は他テーブル名とかぶってはいけない。
 -1テーブル内で同名のコラムは存在できない、他テーブルのコラム名は同名可能。

■テーブル作成文

CREATE TABLE [schema.]table_name
(column datatype
 [, column datatype ...]
)
 [TABLESPACE tablespace]
 [PCTFREE integer]
 [PCTUSED integer]
 [INITRANS integer ]
 [MAXTRANS integer]
 [STORAGE storage-clause]
 [LOGGING | NOLOGGING]
 [CACHE | NOCACHE];

-schema : テーブルの所有者
-table_name : テーブル名
-column : コラム名
-datatype : コラムのデータータイプ
-TABLESPACE : テーブルがデーターを保存するテーブルスペース
-PCTFREE : ブロック内に存在しているRowへUpdateできるように予約させるブロックの%値を指定
  ※例えば"PCTFREE 20"で設定すると、データー風呂kkの20%を使用可能な空領域として維持し、各ブロック行の更新に使用するって意味!
-PCTUSED : オラクルサーバがテーブルの各データーブロックに対して維持しようとする使用領域の最小サイズを%値で指定する。
  ※例えば"PCTUSED 40"で設定すると、データーブロックの使用領域が39%より小さくならないと新しい行を追加できないって意味!
-INITRANS : 1つのデーターブロックに指定できる初期トランザクション値を指定する。
-MAXTRANS : 1つのデーターブロックに指定できる最大トランザクション値を指定する。
-STORAGE : エクステントストレージに関する値を指定する。
-LOGGING : テーブルに対して全ての作業がREDOログファイルに記録されるように指定する。
-NOLOGGING : REDOログファイルにテーブル作成と特定のデーターロードを記録しないように指定する。


■テーブル作成例文
 テーブル作成時の注意事項
 -テーブル名を指定して各コラムは"()"で閉じる。
 -コラムの次のデータータイプは必ず指定しなければいけない。
 -各コラムは","で区別、最後は";"で閉める。
 -1つのテーブルで同じコラム名は×、別テーブルでの同じコラム名は○。


--emp2とdept2テーブルを作成する

SQL> CREATE TABLE EMP2(
  2  EMPNO    NUMBER            CONSTRAINT emp_pk_empno PRIMARY KEY,
--   (コラム) (データータイプ)  (制約条件)
  3  ENAME VARCHAR2(20),
  4  JOB   VARCHAR2(40),
  5  MGR   NUMBER,
  6  HIREDATE DATE,
  7  SAL   NUMBER,
  8  COMN  NUMBER,
  9  DEPTNO NUMBER);

表が作成されました。

SQL> CREATE TABLE DEPT2(
  2  DEPTNO NUMBER CONSTRAINT dept_pk_deptno PRIMARY KEY,
  3  DNAME VARCHAR2(40),
  4  LOC VARCHAR2(50));

表が作成されました。

SQL>


■USERが所有しているすべてのテーブル確認
--USER_TABLESデーターライブラリを確認するとユーザーが所有しているテーブルを確認できる。

SQL> SELECT table_name FROM USER_TABLES;

TABLE_NAME
------------------------------
EMP
DEPT
BONUS
SALGRADE
DUMMY
EMP2
DEPT2

7行が選択されました。

SQL>



2013/08/14

06-04.USERの作成と権限【権限とロール04--ORACLE DBインストール時のデポルトROLE】

オラクルデーターベースを作成すると基本的に作成されるROLEがある。
DBA_ROLESで既に定義されているROLEを確認できる。


SQL> SELECT * FROM DBA_ROLES;

ROLE                           PASSWORD AUTHENTICAT
------------------------------ -------- -----------
CONNECT                        NO       NONE
RESOURCE                       NO       NONE
DBA                            NO       NONE
SELECT_CATALOG_ROLE            NO       NONE
EXECUTE_CATALOG_ROLE           NO       NONE
DELETE_CATALOG_ROLE            NO       NONE
EXP_FULL_DATABASE              NO       NONE
IMP_FULL_DATABASE              NO       NONE
LOGSTDBY_ADMINISTRATOR         NO       NONE
DBFS_ROLE                      NO       NONE
AQ_ADMINISTRATOR_ROLE          NO       NONE

……
……
……


56行が選択されました。

SQL>


多数のROLEがあるが、良く使う3つについて調べてみる。

■CONNECT ROLE
 -ORCLEへ接続できるセッション及びテーブルを作成、確認できるノーマルな権限で構成されている
 -CONNECT ROLEが無いとユーザーを作成してもORACLEへ接続できない。
 -下記コマンドでCONNECT ROLEの権限が確認できる。

SQL> SELECT grantee, privilege
  2  FROM DBA_SYS_PRIVS
  3  WHERE grantee = 'CONNECT';

GRANTEE                        PRIVILEGE
------------------------------ ----------------------------------------
CONNECT                        CREATE SESSION

SQL>



■RESOURCE ROLE
 -Store Procedure、Trigger等PL/SQLを使用できる権限で構成されている。
 -PL/SQLを使用するにはRESOURC ROLEを付与しなければならない。
 -ユーザーを作成すると基本的にCONNECT、RESOURCEロールを付与する。

■DBA ROLE
 -すべてのシステム権限が付与されているロール。
 -DBA ROLEはデーターベース―管理者のみに付与すべき。

06-04.USERの作成と権限【権限とロール03--ロール(Role)】

■ロール(Role)とは?
 ユーザーへ許可出来る権限の集まりと言える。

 -ROLEを使えば権限の付与と回収を楽にできる。
 -ROLEはCREATE ROLE権限を持つユーザーにより作成できる。
 -1ユーザーは多数のROLEへアクセスでき、多数のユーザーへ同じ権限を付与できる。
 -システム権限を付与、回収する際、同じコマンドを使用してユーザーへ付与、回収する。
 -ユーザーはROLEへROLEを付与可能。
 -オラクルデーターベースをインストールするとデポルトで
  CONNECT,RESOURCE,DBA ROLEが提供される。

DBAが多数のユーザーへいちいち権限を付与するのは手間が掛る。
DBAがユーザーの役割に合うROLEを作成してROLEだけユーザーへ指定することにより
効率的にユーザーを管理できる。

■ROLE作成文

CREATE ROLE role_name


■ROLE作成例文

 ROLE付与手順
  ①ROLEの作成:CREATE ROLE manager
  ②ROLEへ権限付与:GRANT create session, create table TO manager
  ③ROLEをユーザーまたはROLEへ付与:GRANT manager TO scott, test1;

---ROLEを作成する

SQL> CREATE ROLE manager;

ロールが作成されました。

---ROLE権限を付与する

SQL> GRANT create session, create table TO manager;

権限付与が成功しました。

---権限が付与されたROLEをUSERもしくはROLEへ付与する
SQL> GRANT manager TO scott, test1;

権限付与が成功しました。

SQL>



06-04.USERの作成と権限【権限とロール02--オブジェクト権限(Object Privileges)】

■オブジェクト権限(Object Privileges)
 オブジェクト権限はUserが所有する特定のオブジェクトを
 他のユーザーがアクセスまたは操作出来るようにするために作成する。

※オブジェクト権限(Object Privileges)とは?
 -テーブル、ビュー、シーケンス、プロシーザー、ファンクションまたはパッケージの中から
  指定された1つのオブジェクトへ特別な作業を実施できるようにする。
 -オブジェクト所有者は他ユーザーへ特定のオブジェクト権限を付与できる。
 -PUBLICで権限を付与すると回収する時もPUBLICで回収しなければならない。
 -基本的に所有するオブジェクトに対してすべての権限が自動で与えられる。
 -WITH GRANT OPTIONはROLEへ権限を付与するとは使えない。

■オブジェクト権限付与文


GRANT object_privilege [  ] 
ON object
TO { user[,user] | role | PUBLIC }
[ WITH GRANT OPTION ]

-object_privilege:付与するオブジェクト権限名
-object:オブジェクト名
-user, role:付与するユーザー名と他DBの役割名
-PUBLIC:オブジェクト権限、DB役割をすべてのユーザーへ付与
-WITH GRANT OPTION:権限を付与されたユーザーもその権限を他ユーザー、役割へ付与できる


表の列(ALTER,DELETE,EXECUTE…)はobject_privilegeになり、
行(テーブル、ビュー、シーケンス、プロシーザー…)がONの次のobjectとなる。


■オブジェクト権限付与例文
---オブジェクト権限を付与するユーザーを作成(test1,test2)
---test1,test2へ基本権限を付与

SQL> show user
ユーザーは"SYS"です。
SQL> CREATE USER test1 IDENTIFIED BY test;

ユーザーが作成されました。

SQL> CREATE USER test2 IDENTIFIED BY test;

ユーザーが作成されました。

SQL> GRANT CONNECT, RESOURCE, CREATE TABLE TO test1, test2;

権限付与が成功しました。

SQL>


---scottで接続する
---test1へempテーブルをSELECT,INSERT出来る権限を付与
---test1も他ユーザーへその権限を付与できる。

SQL> CONN scott/tiger
接続されました。
SQL> show user
ユーザーは"SCOTT"です。
SQL> GRANT SELECT, INSERT
  2  ON emp
  3  TO test1
  4  WITH GRANT OPTION;

権限付与が成功しました。

---test1で接続してempテーブルを参照する。
SQL> CONN test1/test
接続されました。
SQL> show user
ユーザーは"TEST1"です。
SQL> SELECT * FROM scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 13-08-13        800                    20
      7499 ALLEN      SALESMAN        7698 13-08-13       1600        300         30
      7521 WARD       SALESMAN        7698 13-08-13       1250        500         30
      7566 JONES      MANAGER         7839 13-08-13       2975                    20
      7654 MARTIN     SALESMAN        7698 13-08-13       1250       1400         30
      7698 BLAKE      MANAGER         7839 13-08-13       2850                    30
      7782 CLARK      MANAGER         7839 13-08-13       2450                    10
      7788 SCOTT      ANALYST         7566 13-08-13       3000                    20
      7839 KING       PRESIDENT            13-08-13       5000                    10
      7844 TURNER     SALESMAN        7698 13-08-13       1500          0         30
      7876 ADAMS      CLERK           7788 13-08-13       1100                    20

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7900 JAMES      CLERK           7698 13-08-13        950                    30
      7902 FORD       ANALYST         7566 13-08-13       3000                    20
      7934 MILLER     CLERK           7782 13-08-13       1300                    10

14行が選択されました。

SQL>



---test2で接続し、empテーブルを確認
---test1で接続し、SELECT権限をtest2へ付与する
---test2で接続し、empテーブルを再確認

SQL> CONN test2/test
接続されました。
SQL> show user
ユーザーは"TEST2"です。
SQL> SELECT * FROM scott.emp;
SELECT * FROM scott.emp
                    *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。


SQL> CONN test1/test
接続されました。
SQL> show user
ユーザーは"TEST1"です。
SQL> GRANT SELECT on scott.emp TO test2;

権限付与が成功しました。

SQL> CONN test2/test
接続されました。
SQL> show user
ユーザーは"TEST2"です。
SQL> SELECT * FROM scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 13-08-13        800                    20
      7499 ALLEN      SALESMAN        7698 13-08-13       1600        300         30
      7521 WARD       SALESMAN        7698 13-08-13       1250        500         30
      7566 JONES      MANAGER         7839 13-08-13       2975                    20
      7654 MARTIN     SALESMAN        7698 13-08-13       1250       1400         30
      7698 BLAKE      MANAGER         7839 13-08-13       2850                    30
      7782 CLARK      MANAGER         7839 13-08-13       2450                    10
      7788 SCOTT      ANALYST         7566 13-08-13       3000                    20
      7839 KING       PRESIDENT            13-08-13       5000                    10
      7844 TURNER     SALESMAN        7698 13-08-13       1500          0         30
      7876 ADAMS      CLERK           7788 13-08-13       1100                    20

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7900 JAMES      CLERK           7698 13-08-13        950                    30
      7902 FORD       ANALYST         7566 13-08-13       3000                    20
      7934 MILLER     CLERK           7782 13-08-13       1300                    10

14行が選択されました。

SQL>


■オブジェクト権限回収例文

---test1へ付与したempテーブルに対するSELECT, INSERT権限回収例文
---test1の権限が回収されるとtest1が権限付与したtest2の権限も回収される。

SQL> CONN scott/tiger
接続されました。
SQL> show user
ユーザーは"SCOTT"です。
SQL> REVOKE SELECT, INSERT
  2  ON emp
  3  FROM test1;

取消しが成功しました。

SQL> CONN test1/test
接続されました。
SQL> show user
ユーザーは"TEST1"です。
SQL> SELECT * FROM scott.emp;
SELECT * FROM scott.emp
                    *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。


SQL> CONN test2/test
接続されました。
SQL> show user
ユーザーは"TEST2"です。
SQL> SELECT * FROM scott.emp;
SELECT * FROM scott.emp
                    *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。


SQL>


■WITH GRANT OPTIONによるオブジェクト権限回収
 WITH GRANT OPTIONを使用して付与したオブジェクト権限を回収すると
 付与されたユーザーが付与したユーザーの権限も回収される。
 【解説】
1.SCOTTがTEST1にWITH GRANT OPTIONを使用してempテーブルのSELECT権限を付与
2.TEST1がempテーブルのSELECT権限をTEST2へ付与
3.SCOTTがTEST1に付与したempテーブルのSELECT権限を回収


【結果】
 -SCOTTがTEST1に付与したempテーブルのSELECT権限を回収するとTEST2のempテーブル
  SELECT権限も自動的に回収される。

06-03.USERの作成と権限【権限とロール01--システム権限(System Privileges)】

■システム権限(Sysytem Privileges)
 Oracleでの権限(Privileges)は特定タイプのSQL実行、DBオブジェクトへアクセス出来る権限を言う。 

※システム権限(Sysytem Privileges)とは?
  -システム権限はユーザーがDBで特定作業を実施出来るようにする。
  -権限のANYキーワードはユーザーがすべてのスキーマで権限を持つ事を意味する。
  -GRANTコマンドはユーザーまたはROLEについて権限を付与出来る
  -REVOKEコマンドは権限を回収できる。

 ※代表的なシステム権限
  -CREATE SESSION:DBに接続できる権限
  -CREATE ROLE:ORACLE DB役割を作成出来る権限
  -CREATE VIEW:ビューの作成権限
  -ALTER USER:作成したユーザーの定義を修正出来る権限
  -DROP USER:作成したユーザーを削除する権限


■システム権限付与文
GRANT [ system_privilege | role ] TO [ user | role | PUBLIC ] [ WITH ADMIN OPTION ]

-system_privilege:付与するシステム権限の名前
-role:付与するDB役割の名前
-user,role:付与するユーザー名と別DB役割名
-PUBLIC:システム権限またはDB役割をすべてのユーザーへ付与可能
-WITH ADMIN OPTION:権限を付与されたユーザーも自分の権限を他のユーザーまたはロールへ付与できるようになる



■システム権限付与例文
---SYS権限で接続する
SQL> CONN sys/manager AS SYSDBA
接続されました。

---scottユーザーへユーザー作成、修正、削除権限を付与し、
---scottユーザーも他ユーザーへその権限を付与出来るように権限を付与
SQL> GRANT CREATE USER, ALTER USER, DROP USER TO scott WITH ADMIN OPTION;

権限付与が成功しました。

SQL>


■システム権限回収
REVOKE [ system_privilege | role ] FROM [ user | role | PUBLIC ]


■システム権限回収例文
---scottユーザーへ付与した作成、修正、削除権限を回収する
SQL> REVOKE CREATE USER, ALTER USER, DROP USER FROM scott;

取消しが成功しました。

SQL>

■WITH ADMIN OPTIONで付与した権限の回収
WITH ADMIN OPTIONを使用してシステム権限を付与しても権限を回収する際は別々に回収しなければならない。
【解説】
1.DBAがSTORMへWITH ADMIN OPTIONでCREATE TABLEシステム権限を付与
2.STORMがテーブルを作成
3.STORMがCREATE TABLEシステム権限をSCOTTに付与
4.SCOTTがテーブルを作成
5.DBAがSTORMに付与したCREATE TABLE権限を回収


【結果】
 -STORMのテーブルは存在するが、新しいテーブルを作成できる権限は無い
 -SCOTTはテーブルが存在し、新しいテーブルを作成できるCREATE TABLE権限を持っている

2013/08/13

06-02.USERの作成と権限【USERの変更と削除】

■ALTER USER文で変更可能なオプション
 ・パスワード
 ・デポルトテーブルスペース
 ・テンポラリテーブルスペース
 ・テーブルスペース配分
 ・プロファイル、デフォルト役割


■USER修正文
ALTER USER user_name
[ IDENTIFIED {BY password | EXTERNALLY } ]
[ DEFAULT TABLESPACE tablespace ]
[ TEMPORARY TABLESPACE tablespace ]
[ PASSWORD EXPIRE ]
[ ACCOUNT {LOCK | UNLOCK} ]


■USER編集例文

---SYS権限で接続
SQL> CONN /AS SYSDBA
接続されました。

---scott USERのパスワードを変更
SQL> ALTER USER scott IDENTIFIED BY lion;

ユーザーが変更されました。

---scott USERのパスワードが変更されたのを確認出来る
SQL> CONN scott/lion
接続されました。
SQL> CONN /AS SYSDBA
接続されました。

---scott USERのパスワードは初期に戻す
SQL> ALTER USER scott IDENTIFIED BY tiger;

ユーザーが変更されました。

SQL>


■USER削除

DROP USER user_name [CASCADE]

CASCADEを使用するとユーザー関連のすべてのデーターベーススキーマが削除され、
スキーマオブジェクトも物理的に削除される。

■USER情報確認

---DBに登録されているユーザーを確認するにはDBA_USERを参照する
---SQL PLUSを実行し、SYSアカウントで接続する
SQL> CONN / AS SYSDBA
接続されました。

SQL> SELECT username, default_tablespace, temporary_tablespace FROM DBA_USERS;

USERNAME                       DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
------------------------------ ------------------------------ ------------------------------
MGMT_VIEW                      SYSTEM                         TEMP
SYS                            SYSTEM                         TEMP
SYSTEM                         SYSTEM                         TEMP
DBSNMP                         SYSAUX                         TEMP
SYSMAN                         SYSAUX                         TEMP
SCOTT                          USERS                          TEMP
TEST                           USERS                          TEMP
OUTLN                          SYSTEM                         TEMP
FLOWS_FILES                    SYSAUX                         TEMP
MDSYS                          SYSAUX                         TEMP
ORDSYS                         SYSAUX                         TEMP

---ユーザーとテーブルスペースに関する情報が表示される

06-01.USERの作成と権限【USER 作成】

■USER作成

CREATE USER user_name
IDENTIFIELD [BY password | EXTERNALLY]
 [ DEFAULT TABLESPACE tablespace ]
 [ TEMPORARY TABLESPACE tablespace ]
 [ QUOTA { integer [K|M] | UNLIMITIED } ON tablespace ]
 [ PASSWORD EXPIRE ]
 [ ACCOUNT { LOCK | UNLOCK } ]
 [ PROFILE { profile | DEFAULT } ]

・user_name : USERの名前
・BY password : USERログイン時のパスワード
・EXTERNALLY : USERのOSによる認証指定
・DEFAULT TABLESPACE : USERスキーマの為の基本テーブルスペースを指定
・TEMPORARY TABLESPACE : USERの一時的テーブルスペースを指定
・QUOTA : USERが使用するテーブルスペースの領域を指定
・PASSWORD EXPIRE : USERがSQLPLUSでDBにログインする時パスワードを再設定
 (USERがDBにより認証される場合のみ適切なオプションだ。)
・ACCOUNT LOCK/UNLOCK : USERアカウントをロック、アンロックする時使用
 (UNLOCKが基本)
・PROFILE : 資源使用を制御し、USERへ使用される暗号制御処理方式を指定

ここでは簡単なユーザー作成について記載、
詳細なユーザー管理とPROFILE管理はアドミンで…

※TEMPORARY TABLESPACEを指定しないとシステムのテーブルスペースが基本的に指定されるが、システムのテーブルスペースに斷片が発生する可能性があるのでUSER作成時には、TEMPORARY TABLESPACEを指定するのが望ましい

また、DEFAULT TABLESPACEもUSER作成時に指定しないと基本的にシステムテーブルスペースが指定される。だが、USER作成時にDEFAULT TABLESPACEを指定してUSERが持つデーターとオブジェクトの保存スペースを別途管理する必要がある。

システムテーブルスペースは本来の目的(すべてのデーター情報、保存プロシーザー、パッケージ、DBトリーガー等を保存)の為に使う物であり、一般USERのデーター保存に使用してはいけない。

※テーブルスペースとは
 ・オラクルサーバーがデーターを保存する論理的な構造
 ・テーブルスペースは1つまたは多数のデーターファイルで作られる論理的データー保存構造

■USER作成実記

---SQL PLUS実行後、SCOTT/TIGERで接続

SQL> CREATE USER TEST IDENTIFIED BY TEST;
CREATE USER TEST IDENTIFIED BY TEST
                               *
行1でエラーが発生しました。:
ORA-01031: 権限が不足しています。


---SCOTT USERはユーザー作成権限がないので作成不可
---DBA Roleのあるユーザーで接続

SQL> CONN sys/manager AS SYSDBA
接続されました。

---USERを再作成
SQL> CREATE USER TEST IDENTIFIED BY TEST;

ユーザーが作成されました。

SQL>


新しく作成したユーザーで接続してみよう

SQL> CONN TEST/TEST
ERROR:
ORA-01045: user TEST lacks CREATE SESSION privilege; logon denied


警告: Oracleにはもう接続されていません。

---新しく作成したTESTユーザーは権限がないので接続できない
---すべてのユーザーは権限が付与され付与された権限のことしかできない
---TESTユーザーも使用するための権限を付与してあげなければならない

SQL> CONN sys/manager AS SYSDBA
接続されました。
SQL>
SQL> GRANT connect, resource to TEST;

権限付与が成功しました。

SQL> CONN TEST/TEST
接続されました。
SQL>


05.SQLの種類

1.DDL(Data Definition Language)
  データーベースオブジェクト(table,view,index...)の構造を定義する

 ・CREATE データーベースオブジェクトを作成
 ・DROP    データーベースオブジェクトを削除
 ・ALTER    既に存在するデーターベースオブジェクトを再定義(編集)

2.DML(Data Manipulation Language)
  データーの追加、削除、更新等を処理する

 ・INSERT  データーベースオブジェクトへデーターを入力
 ・DELETE  データーベースオブジェクトのデーターを削除
 ・UPDATE データーベースオブジェクトのデーターを修正

3.DCL(Data Control Language)
 データーベース使用者の権限を制御

 ・GRANT  データーベースオブジェクトへ権限を付与
 ・REVOKE 既に付与されたデーターベースオブジェクトの権限を取り消す  

2013/07/30

04.ORACLE SQL勉強用ユーザー作成スクリプト

■SCOTT USERのロック解除
 オラクルをインストールすると基本的にSCOTTユーザーは使用できないようにロックされている
 下記コマンドでロックを解除できる。

---DBA権限で接続する

SQL> ALTER USER scott 
     IDENTIFIED BY tiger 
     ACCOUNT UNLOCK;

---SCOTT USERで接続してみよう

SQL> CONN scott/tiger;



 SCOTTユーザーが存在しなければ下記のように新規作成し、基本テーブルとデーターを作成すればよい。

--- DBA権限で接続し、SCOTTユーザーを作成する
 
 SQL> CREATE USER scott IDENTIFIED BY tiger
      DEFAULT TABLESPACE users
      TEMPORARY TABLESPACE temp;
  
---権限付与

SQL> GRANT connect, resource TO scott;
 
---SCOTT USERで接続し、スクリプト実行
SQL> CONN scott/tiger


■demobld.sql Script Sample
DROP TABLE EMP;
DROP TABLE DEPT;
DROP TABLE BONUS;
DROP TABLE SALGRADE;
DROP TABLE DUMMY;
 
CREATE TABLE EMP
       (EMPNO NUMBER(4) NOT NULL,
        ENAME VARCHAR2(10),
        JOB VARCHAR2(9),
        MGR NUMBER(4),
        HIREDATE DATE,
        SAL NUMBER(7, 2),
        COMM NUMBER(7, 2),
        DEPTNO NUMBER(2));
 
INSERT INTO EMP VALUES
        (7369, 'SMITH',  'CLERK',     7902,
        sysdate,  800, NULL, 20);
         
INSERT INTO EMP VALUES
        (7499, 'ALLEN',  'SALESMAN',  7698,
        sysdate, 1600,  300, 30);
         
INSERT INTO EMP VALUES
        (7521, 'WARD',   'SALESMAN',  7698,
        sysdate, 1250,  500, 30);
         
INSERT INTO EMP VALUES
        (7566, 'JONES',  'MANAGER',   7839,
        sysdate,  2975, NULL, 20);
         
INSERT INTO EMP VALUES
        (7654, 'MARTIN', 'SALESMAN',  7698,
        sysdate, 1250, 1400, 30);
         
INSERT INTO EMP VALUES
        (7698, 'BLAKE',  'MANAGER',   7839,
        sysdate,  2850, NULL, 30);
         
INSERT INTO EMP VALUES
        (7782, 'CLARK',  'MANAGER',   7839,
        sysdate,  2450, NULL, 10);
INSERT INTO EMP VALUES
        (7788, 'SCOTT',  'ANALYST',   7566,
        sysdate, 3000, NULL, 20);
         
INSERT INTO EMP VALUES
        (7839, 'KING',   'PRESIDENT', NULL,
        sysdate, 5000, NULL, 10);
         
INSERT INTO EMP VALUES
        (7844, 'TURNER', 'SALESMAN',  7698,
        sysdate,  1500,    0, 30);
         
INSERT INTO EMP VALUES
        (7876, 'ADAMS',  'CLERK',     7788,
        sysdate, 1100, NULL, 20);
         
INSERT INTO EMP VALUES
        (7900, 'JAMES',  'CLERK',     7698,
        sysdate,   950, NULL, 30);
         
INSERT INTO EMP VALUES
        (7902, 'FORD',   'ANALYST',   7566,
        sysdate,  3000, NULL, 20);
         
INSERT INTO EMP VALUES
        (7934, 'MILLER', 'CLERK',     7782,
        sysdate, 1300, NULL, 10);
 
CREATE TABLE DEPT
       (DEPTNO NUMBER(2),
        DNAME VARCHAR2(14),
        LOC VARCHAR2(13) );
 
INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (20, 'RESEARCH',   'DALLAS');
INSERT INTO DEPT VALUES (30, 'SALES',      'CHICAGO');
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');
 
CREATE TABLE BONUS
        (ENAME VARCHAR2(10),
         JOB   VARCHAR2(9),
         SAL   NUMBER,
         COMM  NUMBER);
 
CREATE TABLE SALGRADE
        (GRADE NUMBER,
         LOSAL NUMBER,
         HISAL NUMBER);
 
INSERT INTO SALGRADE VALUES (1,  700, 1200);
INSERT INTO SALGRADE VALUES (2, 1201, 1400);
INSERT INTO SALGRADE VALUES (3, 1401, 2000);
INSERT INTO SALGRADE VALUES (4, 2001, 3000);
INSERT INTO SALGRADE VALUES (5, 3001, 9999);
 
CREATE TABLE DUMMY
        (DUMMY NUMBER);
 
INSERT INTO DUMMY VALUES (0);
 
COMMIT;

2013/07/23

03.オラクル環境作り(Oracle 11gインストール)

■環境:Window7 64bit, Oracle 11g
・オラクルサイトからwindows用オラクルをダウンロード
http://www.oracle.com/technetwork/jp/database/enterprise-edition/downloads/index.html

※ダウンロードにはユーザー登録が必要になる。
 簡単なので登録してログインしよう~!

・ファイルは2つだが、別々にインストールする物ではない。
 1つ目のファイルにだけexeファイルがあり、2つのファイルを別々のフォルダに
 保管してしまうと、インストール途中、エラーが発生する。
 必ず、2つのフォルダを合わせてからsetup.exeを実行しよう!!


■オラクルインストール

・ステップ①


※セキュリティ問題が起きた時に通知を受けるメール設定だけど、
 インストール時は設定必要ないかと…


・ステップ②


※データベースまですべて設置するので
 「データベースの作成および構成」を選択


・ステップ③


※ローカルでテストするのでサーバークラスまで選択


・ステップ④


※単一を選択


・ステップ⑤


※インストール工程を詳しく把握するため、拡張インストールを選択


・ステップ⑥


※言語選択に必ず日本語を追加する。デポルトに入ってる。


・ステップ⑦


※Enterprise Editionを選択してみた。


・ステップ⑧

※格納場所を指定。好きな場所に…

・ステップ⑨

※とりあえず、汎用目的選択


・ステップ⑩
※デポルトでorclに設定されている


・ステップ⑪

※メモリー割当設定。基本的に50%を超えないようにするのがいい。


・ステップ⑫

※ここはアラート通知の設定だから、とりあえずパス…


・ステップ⑬
※データファイルの位置指定は勝手に変えちゃダメ!! デポルトのまま次に進もう。


・ステップ⑭


※パックアップは必要な時にするので、自動にはしない。


・ステップ⑮


※パスワードはアカウント毎に設定できるが、
 今回はすべてのアカウントのパスワードを1つに設定


・ステップ⑯

※インストール設定の終了。実際のインストールが始まる。


次はインストールされたオラクルユーザーアカウントをつくります。

QLOOKアクセス解析