Oracle SQL DDL - accidentlywoo/sec GitHub Wiki

[DML] 계정 만들기

Data Dictionary -> user_tables

sqlplus

system 계정 접속

계정 정보확인

show user

성공 실행결과

USER is "SYSTEM"

test 계정 만들기

CREATE USER test IDENTIFIED BY test;

성공 실행결과

User created.

생성된 'test'계정에 접속 시도

conn test/test

실패 결과

user TEST lacks CREATE SESSION privilege; logon denied

사용자들의 연결은 세션이 필요하다 -> Session

system 계정으로 다시 접속

test계정에 권한 주기

GRANT CREATE SESSION to test;

성공 결과

Grant succeeded.

test 계정 접속 시도

conn test/test

성공 결과

Connected.

세션이 주어지고, 접속이 성공한다. 테이블을 생성해 보자.

CREATE TABLE test(a number);

실패 결과

CREATE TABLE test(a number)
*
ERROR at line 1:
ORA-~~: insufficient privileges;

생성권한을 줘야 한다.

system 계정으로 다시 접속

GRANT CONNECT, RESOURCE to test;

GRANT는 ROLE을 줄 수도 있고, 개별적인 권한을 줄 수도 있다.

다시 test 계정으로 접속 테이블을 생성해 보자.

CREATE TABLE test(a number);

성공 결과

Table created.

테이블 생성

CREATE TABLE 테이블명(
a CHAR,
a1 CHAR(3),
a2 VARCHAR2(3)
)

CHAR타입은 문자열 길이를 지정하지 않아도 테이블 생성이 가능, (CHAR는 MAXIMUM 1자리로 생성됨 / NUMBER 문자길이를 지정하지 않으면 최댓값으로 생성)

But VARCHAR는 문자길이를 꼭 지정해줘야 한다.(생성 에러)

  • CHAR은 고정 문자길이
  • VARCHAR (오라클은 VARCHAR2사용) 문자 길이만큼 저장

오라클에서 제공하는 함수를 이용해서 컬럼의 문자열 길이를 알 수 있다.

SELECT LENGTH(a), LENGTH(a1), LENGTH(a2) FROM 테이블명;
CREATE TABLE 테이블명(
dt DATEm
dt1 TIMESTAMP
);

-DATE : DATE에도 년월일 시분초 정보가 들어있지만, 출력할때는 년월일만 보여준다. -TIMESTAMP : 밀리 세컨즈 단위의 자세한 시간정보를 보고싶을 땐, TIMESTAMP를 사용하자.

날짜타입의 데이터는 자릿수 지정 절대하면 안된다.

DATE타입으로할까? VARCHAR타입으로할까?

  • 자동으로 날짜발급 -> DATE / 입력을 받아야 되는 경우 -> 문자타입
INSERT INTO 테이블명 VALUES(SYSDATE, SYSTIMESTAMP);

SELECT * FROM 테이블명;

성공 결과

DT                DT1
------------------------------------------
20/06/08          20/06/08 10:45:52.109000
SELECT TO_CHAR(dt,'YY/MM/DD HH24:MI:SS'), dt1 FROM 테이블명;
DT                        DT1
------------------------------------------
20/06/08 10:45:52         20/06/08 10:45:52.109000

아주 정확한 표현은 TIMESTAMP를 사용한다.

테이블 만들기 + 제약조건

Data Dictionary -> User Constraints

제약 조건 정의

구문

CREATE TABLE [schema] table
    (column datatype [DEFAULT expr]
    [column_constraint].
    ...
    [table_constraint][,...]);

열 레벨 제약 조건 구문

column [CONSTRAINT constraint_name] constraint_type,

테이블 레벨 제약 조건 구문

column,...
   [CONSTRAINT constraint_name] constraint_type
   (column, ...),

-> 테이블 레벨 제약조건 사용을 권장한다.

제약 조건 유형 1.NOT NULL 2. UNIQUE 3. PRIMARY KEY 4. FORIEGN KEY 5. CHECK

예시를 보자

CREATE TABLE 사원(
    사번 VARCHAR2(10) CONSTRAINT 사원_사번_pk PRIMARY KEY,
    이름 VARCHAR2(20) NOT NULL,
    직무 ID VARCHAR2(6),
    주민번호 CHAR(13),
    급여 NUMBER(7),
    CONSTRAINT 사원_직무ID_fk FOREIGN KEY (직무ID) REFERENCES 직무(직무ID),
    CONSTRAINT 사원_주민번호_uq UNIQUE (주민번호),
    CONSTRAINT 사원_급여_ck CHECK (급여 >=0)
);
INSERT INTO 직무(직무ID, 직무명) VALUES ('A', '인사업무');
INSERT INTO 사원(사번, 이름, 직무ID, 급여) VALUES ('s1','n1','A', 1000);
DELETE FROM 직무 WHERE 직무ID = 'A'; -- ERROR

부모 테이블에서 참조되고있는 자식테이블이 있을때 에러 발생

사원 테이블 생성시

~, CONSTRAINT 사원_직무ID_fk FOREIGN KEY (직무ID) REFERENCES 직무(직무ID) ON DELETE CASCADE

자식 테이블을 생성할 때, 참조하는 부모 테이블의 정보가 삭제되면 같이 삭제되겠다는 제약조건! 업무에선 잘 사용하지 않는다.