본문 바로가기

SQLP 자격증

SQL - 제약조건, 뷰, 인덱스, 권한

@markdown

## 무결성 제약 조건의 개념과 종류

____

- `NOT NULL` : NULL을 허용 X.

- `UNIQUE` : 중복된 값을 허용하지 않고, 항상 유일한 값을 갖도록 함.

- `PRIMARY KEY` : NULL을 허용 X.

- `FOREIGN KEY` : 참조되는 테이블의 칼럼의 값이 존재하면 허용함

- `CHECK` : 저장 가능한 데이터 값의 범위나 조건을 지정하여 설정한 값만을 허용함


<pre><code class="sql" style="font-size:14px">USER_CONSTRAINTS의 내용을 출력

SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME

FROM USER_CONSTRAINTS

</code></pre>


### CHECK 조건

____

- 제한된 데이터만 받을 수 있도록 조건 지정

<pre><code class="sql" style="font-size:14px">

컬럼이름 자료형 constraint 조건이름 check(컬럼 in(값1, 값2 ...))

gender char(1) constraint student_gender_chk check(gender in('M', 'F'))

</code></pre>


- 내가 만든 (USER) 제약 조건(CONSTRAINTS)의 정보를 조회 할 수 있다.

<pre><code class="sql" style="font-size:14px">제약조건 확인

desc user_constraints

</code></pre>



- 상품코드와 시퀀스 번호를 조합해 Primary Key로 지정한다.

<pre><code class="sql" style="font-size:14px">create table sales(

product_code number(2),

seq number(2),

sales_date date,

memo varchar2(2000),

constraint sales_pk primary key(product_code, seq)

)

</code></pre>


- 테이블 복사 시 제약조건까지 복사되진 않는다.

<pre><code class="sql" style="font-size:14px">create table emp_copy

as select * from emp;

</code></pre>


- 오라클에서는 제약 조건을 비활성화시킴으로서 제약조건을 삭제하지 않고도 제약 조건 사용을 잠시 보류할 수 있는 방법을 제공해준다.


- 부모테이블과 자식테이블 사이에 제약조건으로 묶여있는 경우, 제약조건을 삭제하게 되면 참조 무결성에 위배된다.

- 참조 무결성을 지키기 위해 잠시 제약조건을 비활성화 할 수 있다.

- 부모테이블의 데이터 삭제나 삽입 시 제약조건에 걸린 경우 해결하기 위해 활성/비활성 기능을 통해 제약조건을 다룬다.


<pre><code class="sql" style="font-size:14px">alter table 테이블이름

enable constraint 제약조건 이름

disable constraint 제약조건 이름

</code></pre>


### CASCADE 옵션

____

- 부모 테이블과 자식 테이블 간의 참조 조건이 설정 되어 있을 때 부모 테이블의 제약 조건을 비활성화하면 이를 참조하고 있는 자식 테이블의 제약 조건까지 같이 비활성화시켜 주는 옵션


#### 제약조건 cascade

<pre><code class="sql" style="font-size:14px">drop primary key cascade

</code></pre>


- 부모 테이블의 기본키 제약조건을 삭제하게 되면 연관되어 있는 자식 테이블의 제약조건까지 연쇄적으로 삭제가 된다.


#### 데이터 cascade

- 외부키 제약조건에 cascade 옵션을 주고 테이블을 생성하게 되면, 부모 테이블에서 제거되는 데이터가 자식 테이블까지 삭제되는 연쇄 삭제가 발생한다.


## 뷰(View)

____

- 물리적인 데이터 테이블에서 가져와 생성한 가상의 테이블

- select 문장의 결과가 저장된다.

- 복잡한 sql을 미리 뷰로 정의하고 재사용 할 수 있다.

- 보안상 이유로 칼럼 조회를 제한하기 위해 뷰를 사용함


<pre><code class="sql" style="font-size:14px">CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name

[(alias, alias, alias, ...)]

AS subquery

[WITH CHECK OPTION]

[WITH READ ONLY];

</code></pre>


- replace 옵션 : 기존에 뷰가 존재하더라도 삭제하지 않고 새로운 구조의 뷰로 변경할 수 있다.

- force 옵션 : 기본 테이블의 존재 여부에 상관없이 뷰를 생성합니다.(존재여부 체크X)

- noforce : 테이블 존재여부 체크 함

- WITH READ ONLY : 해당 뷰를 통해서는 select만 가능하며 insert/update/delete를 할 수 없다.


- 뷰를 생성할 수 있는 권한 부여

<pre><code class="sql" style="font-size:14px">grant create view to SCOTT

</code></pre>



## 시퀀스

____

- 오라클에서 행을 구분하기 위해서 기본 키를 설정한다. 하지만 기본키는 중복된 값을 가질 수 없으므로 항상 유일한 값을 가져야 합니다.

- 시퀀스는 테이블 내의 유일한 숫자를 자동으로 생성해준다.

- 시퀀스를 기본 키로 사용하게 되면 사용자의 부담을 줄일 수 있다.

- MySql에서는 Auto Increment 기능이 있다.

<pre><code class="sql" style="font-size:14px">CREATE SEQUENCE sequence_name

[START WITH n]

[INCREMENT BY n]

[{MAXVALUE n | NOMAXVALUE}]

[{MINVALUE n | NOMINVALUE}]

[{CYCLE | NOCYCLE}]

[{CACHE n | NOCACHE}]

</code></pre>


- 시퀀스의 nextval 실행한 순간 시퀀스 번호는 증가한다.

- 시퀀스 객체에 접근한 것이 성공했기 때문에 쿼리의 성공 실패 여부에 상관없이 증가한다.


<pre><code class="sql" style="font-size:14px">create sequence seq_no --시퀀스 생성

create table seqTest(

  id number,

name varchar2(20)

);

create table seqTest2(

id number,

name varchar2(20)

);


insert into seqTest values(seq_no.nextval,  '첫번째')

insert into seqTest2 values(seq_no.nextval, '두번째')

insert into seqTest values(seq_no.nextval,  '세번째')

insert into seqTest2 values(seq_no.nextval, '네번째')

insert into seqTest999 values(seq_no.nextval, '네번째') -- 실패해도 시퀀스 번호 증가


select * from seqTest

select * from seqTest2

</code></pre>


## 인덱스

____

#### 장점

- 검색 속도가 빠르다.

- 시스템에 걸리는 부하를 줄여 성능을 향상시킨다.


#### 단점

- 인덱스를 위한 저장 공간이 필요하다

- 인덱스 생성에 시간이 걸린다.

- 데이터 변경하는 DML(update, insert, delete) 쿼리가 많이 발생하는 경우 성능이 저하된다.


#### 특징

- Oracle은 Primary Key, Unique를 설정한 칼럼은 자동으로 인덱스 생성해준다.

- 기본적으로 Oracle의 인덱스는 B-트리 구조로 생성된다.


<pre><code class="sql" style="font-size:14px">만들어진 인덱스 확인 하기

select *

from user_ind_colums

where table_name = 'emp'


create table indextest as

select * from emp


create index idx_ename on indextest(ename)

</code></pre>

## 사용자 관리

_____


### 시스템 권한

____


CREATE USER : 새롭게 사용자를 생성하는 권한

DROP USER : 사용자를 삭제하는 권한

DROP ANY TABLE : 임의의 테이블을 삭제할 수 있는 권한

QUERY REWRITE : 함수 기반 인덱스를 생성하는 권한

BACKUP ANY TABLE : 임의의 테이블을 백업할 수 있는 권한

<pre><code class="sql" style="font-size:14px">CREATE USER user_name

IDENTIFIED BY password;

</code></pre>


GRANT CREATE SESSION TO user_name;

CREATE SESSION : 데이터베이스에 접속할 수 있는 권한

CREATE TABLE : 사용자 스키마에서 테이블을 생성할 수 있는 권한

CREATE VIEW : 사용자 스키마에서 뷰를 생성할 수 있는 권한

CREATE SEQUENCE : 사용자 스키마에서 시퀀스를 생성할 수 있는 권한

CREATE PROCEDURE : 사용자 스키마에서 함수를 생성할 수 있는 권한





### 객체 권한

____

사용자에게 특정 객체를 조작할 수 있는 권한을 부여한다.

`ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `REFERENCES`, `SELECT`, `UPDATE`



'SQLP 자격증' 카테고리의 다른 글

SQLP - 인덱스 기본 원리  (0) 2018.01.21
SQLP - 옵티마이저와 실행계획  (0) 2018.01.15
SQL - 서브쿼리  (0) 2017.05.16
SQL - Group by, Having, Join  (0) 2017.05.15
SQL - 기초  (0) 2017.05.12