씨네
공부하는 개발자 강씨네
씨네
  • 분류 전체보기 (460)
    • Web (21)
      • HTML (11)
      • CSS (10)
    • JS 관련 (49)
      • JavaScript (27)
      • JQuery (22)
    • TS 관련 (15)
      • TypeScript (15)
    • NodeJS (7)
      • NodeJS (7)
    • 따라하며 배우는 시리즈 (23)
      • NodeJS & ReactJS Basic (23)
      • NodeJS & ReactJS Movie (0)
      • NodeJS & ReactJS Youtube (0)
      • NodeJS & ReactJS ChatBot (0)
    • SPA (14)
      • React (14)
      • Vue (0)
      • Anguler (0)
    • Java 관련 (118)
      • Java (52)
      • JDBC (6)
      • JSP & Servlet (18)
      • Spring Legecy (38)
      • SpringBoot (4)
    • Python (26)
      • Python (20)
      • PyMongo (1)
      • Django (5)
    • Git (24)
      • Github (24)
    • RDB (22)
      • Oracle (21)
      • MySQL (1)
    • NoSQL (5)
      • MongoDB (5)
    • OS (4)
      • Linux (4)
    • 빅데이터 (2)
      • hadoop (2)
    • IDE (20)
      • eclipse (11)
      • VSCODE (4)
      • VisualStudio (1)
      • IntelliJ (1)
      • PyCharm (1)
      • DBeaver (2)
    • Install (3)
      • Tomcat (1)
      • Docker (1)
      • Anaconda (1)
    • 오류&에러 (28)
      • TS (2)
      • NodeJS (7)
      • SQL (8)
      • Java (1)
      • Spring (4)
      • Git (6)
      • 기타 (0)
    • 알고리즘 (67)
      • 수열 (1)
      • 백준(backjoon) (39)
      • Programmers (27)
    • 자격증 (5)
      • SQLD (5)
    • 기타 (2)
    • IT유튜브로 지식쌓기 (2)

공지사항

인기 글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
씨네

공부하는 개발자 강씨네

[ORACLE] DCL - 데이터 제어어
RDB/Oracle

[ORACLE] DCL - 데이터 제어어

2021. 12. 22. 11:27
728x90

SQL(Structured Query Language)의 DDL(Data Definition Language), DML(Data Manipulation Language), DCL(Data Control Language) 중 지난번 포스팅에서는 DDL에 대하여 알아봤었는데요.

이번 포스팅에서는 데이터 정의 언어인 DCL에 대하여 알아볼 예정입니다.

DCL은 데이터 제어 언어로 데이터, 트랙잭션을 저장 및 취소하는 COMMIT과 ROLLBACK 명령어가 있고 DB 권한을 부여 및 삭제하는 GRANT / REVOKE가 있습니다.

 

COMMIT / ROLLBACK : 데이터, 트랜잭션 저장 / 취소

GRANT / REVOKE : DB 권한 부여 / 삭제

 

1. 권한

1. 시스템 권한

- 객체 생성, 변경, 소멸 등에 관한 권한으로, SYS(SYSTEM)에게 부여함.

- 시스템 권한은 기능이 매우 강력하여, 대부분 관리자나 개발자만 부여함.

EX) 테이블 스페이스 생성, 임의의 테이블행 삭제 등을 할 수 있는 권한

 

2. 개체 권한

- 사용자가 특정 개체에 대해 특정 작업을 수행 가능하도록 일반 사용자에게 부여하는 권한

- 객체 내용 조작과 관련된 권한으로, 객체 소유자에게 부여받는 권한

EX) 특정 테이블의 행 삭제

 

3. 역할(ROLE)

- 시스템 권한만 해도 120가지 이상

- 많은 권한을 사용자마다 일일이 부여하기가 힘들어서 권한들을 미리 정의해 놓은 집합(ROLE)을 만들었다.

- 사용자에게 특정 집합을 권한 대신 부여

 

 

설치와 동시에 기본적으로 생성되어 있는 ROLE

- CONNECT : 접속 권한을 가진 ROLE

- RESOURCE : 객체의 생성, 변경, 삭제 등의 기본 시스템 권한을 가진 ROLE

- DBA : DB 관리에 필요한 권한을 가진 ROLE

- SYSDBA : DB 시작과 종료 및 관리 권한을 가진 ROLE

- SYSOPER : SYSDBA + DB 생성 권한을 가진 ROLE

 

​

​

2. 제약조건

제약조건은 테이블을 만들 때 조건을 정해주는 것을 말합니다.

제약조건도 이름으로 관리를 하게 됩니다.

제약조건의 이름은 문자로 시작해야 하며 길이는 30자까지 가능합니다.

이름을 따로 지정하지 않게 되면 자동 생성됩니다.

테이블을 생성한 후 테이블의 생성과 동시에 생성됩니다.

 

데이터 무결성 - 데이터가 손상되거나 원래의 의미를 잃지 않고 유지되는 상태.

 

*무결성 제약조건 : 입력되는 자료들의 규칙을 정해줌

제약조건
설명
설정 레벨
NOT NULL
해당 걸럼에 NULL을 입력할 수 없도록
컬럼
UNIQUE
해당 컬럼 또는 컬럼 조합 값이 유일하도록
컬럼, 테이블
PRIMARY KEY
각 행을 유일하게 식별할 수 있도록
컬럼, 테이블
CHECK
해당 컬럼에 특정 조건을 향상 만족시키도록
컬럼, 테이블

제약조건 NOT NUL이 입력된 컬럼은 NULL 값이 들어갈 수 없습니다.

UNIQUE는 해당 칼럼의 값을 입력할 때 중복된 값을 입력할 수 없습니다.

PRIMARY KEY는 기본 키로 지정합니다. (UNIQUE + NOT NULL)

CHECK는 조건을 넣어주면 컬럼의 값이 조건에 항상 만족해야 합니다..

 

 

 

3. 연습

--Q1) 크기가 3인 CHAR형의 ID컬럼, 크기가 20인 VARCHAR2형의 NAME컬럼이 있는 TABLE_NOTNULL01테이블을 만들자( 단, ID컬럼은 컬럼레벨에서 NOT NULL 제약조건을 가진다).

CREATE TABLE TABLE_NOTNULL01(
ID CHAR(3) NOT NULL,
NAME VARCHAR2(20)
);

한번 이 테이블에 값을 넣어 볼까요??

INSERT INTO TAVLE_NITNULL01
VALUES('100','ORACLE');

값이 잘 들어가네요.

하지만 NULL 값을 넣으면 오류가 납니다!

 

 

--Q2) 크기가 3인 CHAR형의 ID컬럼, 크기가 20인 VARCHAR2형의 NAME컬럼이 있는 TABLE_NOTNULL02테이블을 만들자( 단, 테이블 레벨에서 ID 컬럼에 NOT NULL 제약조건을 넣는다). (에러가 발생하면 그 이유를 설명하자.)

CREATE TABLE TABLE_NOTNULL02(
ID CHAR(3),
NAME VARCHAR2(20),
CONSTRAINT TN02_ID_NN NOT NULL(ID)
);

NOT NULL의 경우 컬럼레벨에서만 제약조건을 넣어줄 수 있습니다. 테이블 레벨에 넣으려고 하면 에러가 발생합니다.

 

 

--Q3) 크기가 3인 CHAR형의 ID컬럼, 크기가 20인 VARCHAR2형의 NAME컬럼이 있는 TABLE_UNIQUE01테이블을 만들자( 단, 컬럼레벨에서 ID 컬럼에 UNIQUE 제약조건을 넣는다).

CREATE TABLE TABLE_UNIQUE01(
ID CHAR(3) UNIQUE,
NAME VARCHAR2(20)
);

ID컬럼은 UNIQUE 제약조건이 걸려있습니다. 그럼 ID컬럼에 같은 값을 한번 넣어볼까요??

INSERT INTO TABLE_UNIQUE01 VALUES('100','ORACLE');
INSERT INTO TABLE_UNIQUE01 VALUES('100','JAVA');

처음 들어간 값은 잘 들어갔지만 ID컬럼이 UNIQUE의 제약조건이 걸려있기 때문에 이후 ID에는 100이라는 값은 들어갈 수 없습니다.

 

 

--Q4) 크기가 3인 CHAR형의 ID컬럼, 크기가 20인 VARCHAR2형의 NAME컬럼, NUMBER형의 NUM컬럼이 있는 TABLE_UNIQUE02테이블을 만들자( 단, 테이블 레벨에서 ID 컬럼과 NAME컬럼에 UNIQUE제약조건을 넣는다 – 제약조건의 이름은 TU02_ID_UN).

CREATE TABLE TABLE_UNIQUE02(
ID CHAR(3),
NAME VARCHAR2(20),
NUM NUMBER,
CONSTRAINT TU02_ID_UN UNIQUE(ID,NAME)
);

이번에는 ID컬럼과 NAME컬럼이 묶여있습니다.

둘 다 같은 값이 들어올 수 없습니다.

ID와 NAME 중 둘 중 하나만 다른 값이 들어와도 값을 넣어줄 수 있습니다.

하지만 두 개의 값 모두 같으면 테이블에 값을 넣을 수 없습니다.

 

 

--Q5) 크기가 3인 CHAR형의 ID컬럼, 크기가 20인 VARCHAR2형의 NAME컬럼이 있는 TABLE_PK01테이블을 만들자. (단, ID컬럼의 제약조건은 컬럼레벨에서 PRIMARY KEY로 설정한다.)

CREATE TABLE TABLE_PK01(
ID CHAR(3) PRIMARY KEY,
NAME VARCHAR2(20)
);

PRIMARY KEY는 NOT NULL과 UNIQUE가 합쳐진 제약조건이라고 할 수 있습니다. NULL 값이 들어갈 수 없고 중복 값이 들어갈 수 없게 됩니다.

 

INSERT INTO TABLE_PK01 VALUES('100', 'ORACLE');
INSERT INTO TALBE_PK01 VALUES('200', 'ORACLE');
INSERT INTO TABLE_PK01 VALUES('200', 'ORACLE');
INSERT INTO TALBE_PK01 VALUES(NULL, 'ORACLE');

ID에 이미 있는 값을 넣거나 NULL 값을 넣으면 위와 같은 에러가 발생합니다.

​

 

 

--Q6) 크기가 3인 CHAR형의 ID컬럼, 크기가 20인 VARCHAR2형의 NAME컬럼, NUMBER형의 NUM컬럼이 있는 TABLE_PK02테이블을 만들자. (단, ID와 NAME컬럼의 제약조건은 PRIMARY KEY로 설정한다. 제약조건은 테이블 레벨에서 설정하며 이름은 TP02_PK로 한다.)

CREATE TABLE TABLE_PK02(
ID CHAR(3),
NAME VARCHAR2(20),
NUM NUMBER,
CONSTRAINT TP02_PK PRIMARY KEY (ID,NAME)
);

ID와 NAME컬럼에 제약조건이 걸려있습니다. 어떤 값이 입력이 안될까요??

INSERT INTO TABLE_PK02 VALUES('100','ORACLE',1);
INSERT INTO TABLE_PK02 VALUES('200','JAVA',2);
INSERT INTO TABLE_PK02 VALUES(NULL,'ORACLE',3);
INSERT INTO TABLE_PK02 VALUES('100','JAVA',4);

NULL 값은 당연히 들어갈 수 없습니다. 또한 ID, NAME 두컬럼의 값이 같은 값도 들어갈 수 없습니다. 대신 한 컬럼만 같고 다른 컬럼이 다른 값이라면 들어갈 수 있습니다.

 

 

--Q7) 크기가 3인 CHAR형의 ID컬럼, 크기가 20인 VARCHAR2형의 NAME컬럼, 크기가 3인 CHAR의 PKID컬럼이 있는 TABLE_FK01테이블을 만들자.(단, ID컬럼은 컬럼 레벨에서 PRIMARY KEY이며 PKID컬럼은 TABLE_PK01테이블의 ID컬럼을 참조한다.)

 
CREATE TABLE TABLE_FK01(
ID CHAR(3) PRIMARY KEY,
NAME VARCHAR2(20),
PKID CHAR(3) REFERENCES TABLE_PK01(ID)
);

PKID가 TABLE_PK01테이블의 ID컬럼을 참조한다고 했습니다. 그럼 TABLE_PK01테이블의 ID컬럼안에 있는 값만 가져다 쓸 수 있습니다.

INSERT INTO TABLE_FK01 VALUES('123','ORACLE','100');
INSERT INTO TABLE_FK01 VALUES('124','ORACLE','200');
INSERT INTO TABLE_FK01 VALUES('125','JAVA','300');

아까 TABLE_PK01테이블의 ID컬럼에 100이랑 200은 넣었었는데 300은 안 넣었었죠??

그래서 에러가 발생합니다.

 

 

--Q7) 크기가 3인 CHAR형의 ID컬럼, 크기가 3인 CHAR형의 PKID컬럼, 크기가 20인 VARCHAR2형의 PKNAME컬럼이 있는 TABLE_FK02 테이블을 만들자.(단, ID컬럼은 컬럼레벨의 PRIMARY KEY의 제약조건을 가지며 PKID,PKNAME컬럼은 TABLE_PK02테이블의 ID,NAME컬럼을 참조한다.)

CREATE TABLE TABLE_FK02(
ID CHAR(3) PRIMARY KEY,
PKID CHAR(3),
PKNAME VARCHAR2(20),
FOREIGN KEY(PKID,PKNAME) REFERENCES TABLE_PK02(ID,NAME)
);

좀 전에 TABLE_PK02테이블에 들어있는 ID, NAME의 값을 참조할 수 있습니다.

 

 
INSERT INTO TABLE_FK02 VALUES(1,'100','ORACLE');
INSERT INTO TABLE_FK02 VALUES(2,'200','JAVA');
INSERT INTO TABLE_FK02 VALUES(3,'100','JAVA');

위 3개의 명령은 모두 잘 수행이 됩니다.

INSERT INTO TABLE_FK02 VALUES(4,'400','JAVA')

위의 명령어는 TABLE_PK02 테이블에 400의 값을 가진 ID가 없습니다. 따라서 ORACLE이라는 값을 가진 NAME이 있다고 하더라도 에러가 발생하게 됩니다.

 

 

--Q8) 크기가 3이고 CHAR형의 EMP_ID컬럼, 크기가 20이고 VARCHAR2형의 NAME컬럼, 크기가 1이고 CHAR형의 MARRIAGE컬럼을 가진 TABLE_CHECK01테이블을 만들자.(단, EMP_ID컬럼은 PRIMARY KEY, MARRIAGE에는 ‘Y’와 ‘N’의 값만 들어갈 수 있다.)

CREATE TABLE TABLE_CHECK01(
EMP_ID CHAR(3) PRIMARY KEY,
NAME VARCHAR2(20),
MARRIAGE CHAR(1) CHECK(MARRIAGE IN('Y','N'))
);

테이블을 만들었습니다. MARRIAGE컬럼에 정말 Y랑 N만 들어갈까요??

INSERT INTO TABLE_CHECK01 VALUES('123','HONG','Y');
INSERT INTO TABLE_CHECK01 VALUES('124','LEE','N');
INSERT INTO TABLE_CHECK01 VALUES('125','KIM','A');

위의 값을 넣어보겠습니다.

MARRIAGE컬럼에 Y와 N 이외의 값을 넣으면 에러가 발생합니다.

 

 

--Q9) 크기가 3이고 CHAR형의 EMP_ID컬럼, 크기가 20이고 VARCHAR2형의 NAME컬럼, 크기가 1이고 CHAR형의 MARRIAGE컬럼을 가진 TABLE_CHECK02테이블을 만들자.(단, EMP_ID컬럼은 PRIMARY KEY, MARRIAGE에는 ‘Y’와 ‘N’의 값만 들어갈 수 있으며 테이블 레벨의 제약조건 이름은 TC_CK로 한다.)

CREATE TABLE TABLE_CHECK02(
EMP_ID CHAR(3) PRIMARY KEY,
NAME VARCHAR2(20),
MARRIAGE CHAR(1),
CONSTRAINT TC_CK CHECK(MARRIAGE IN('Y','N'))
);

이번에도 Y와 N 값만 들어갈 수 있을까?

INSERT INTO TABLE_CHECK02 VALUES('123','HONG','Y');
INSERT INTO TABLE_CHECK02 VALUES('124','LEE','N');
INSERT INTO TABLE_CHECK02 VALUES('125','KIM','A');

마찬가지로 Y와 N은 들어가지만 A를 넣으려 하면 에러가 발생합니다.

728x90

'RDB > Oracle' 카테고리의 다른 글

[ORACLE] 문자열 자르기, 해당문자 인덱스 반환(SUBSTR, INSTR)  (0) 2021.12.24
[ORACLE] 문자열제거, 공백제거(RPAD / LPAD, RTRIM / LTRIM, TRIM)  (0) 2021.12.23
[ORACLE] DDL - 데이터 정의어  (0) 2021.12.21
[ORACLE] DML - 데이터 조작어  (0) 2021.12.20
[ORACLE] 기본 개념과 용어 및 트랜잭션  (0) 2021.12.19
    'RDB/Oracle' 카테고리의 다른 글
    • [ORACLE] 문자열 자르기, 해당문자 인덱스 반환(SUBSTR, INSTR)
    • [ORACLE] 문자열제거, 공백제거(RPAD / LPAD, RTRIM / LTRIM, TRIM)
    • [ORACLE] DDL - 데이터 정의어
    • [ORACLE] DML - 데이터 조작어
    씨네
    씨네
    개발자 씨네가 공부하는 내용을 기록 겸 공유하는 블로그입니다!

    티스토리툴바