[TIL] Day20 - Oracle 관리자/사용자 명령, 제약 조건

JIONY·2022년 8월 23일

TIL - DBMS & SQL

목록 보기
1/5
post-thumbnail

자바는 잠시 홀드하고 오라클을 배우는 챕터로 넘어옴. 문제는.. 맥 M1에서 오라클 서버를 띄우는 방법만 몇 시간을 시도하고 그럼에도 SQL DEVELOPER에서 SYS 접속이 안된다는 것 ^^ㅎㅎ 해결 방법 자세히 남겨주시고 댓글로 문제해결도 도와주시는 능력자분 덕분에 이것저것 시도해보고 있는데 제발 오늘은 그 숙제를 풀고 싶다.. 제발요 과제도 온라인 버전으로 한ㅋㅋㅋㅋㅋㅋ 눈물.


학습 환경

  • 오라클 11g 버전 / SQL DEVELOPER 22.2.0 버전 사용

개요

  • DB: 데이터를 저장하는 저장소
  • DBMS: DB(저장소)를 관리하는 소프트웨어
    • 데이터베이스에 계정, 객체, 보안 등 다양한 환경을 추가한 프로그램(다중접속이 가능)
    • ex. Oracle, MySQL
  • SQL: 구조화 가능한 질의어
  • 외부 프로그램(ex. java)에서 오라클에 접속(DB와 Java 연동)하는 방법까지 학습 예정
    • 외부 프로그램: Java, SQL Developer, SQL Command Line(SQL Plus)…


관리자 명령

사용자 관리

  • academy/student

로그인

CONNECT 아이디/비밀번호
-- CONN으로 축약 가능

-- 로그인한 계정 확인
SHOW USER;

계정 생성

CREATE USER 아이디 IDNTIFIED BY 비밀번호;
  • 비밀번호 숫자로 시작 불가
  • 방금 만든 계정으로 로그인하려고 시도하면 에러 발생
    - msg: TESTUSER lacks CREATE SESSION privilege; logon denied
    - 권한까지 받아야 한다는 의미
    - 로그인을 실패했기 때문에 강제 로그아웃됨

계정 변경

-- 비밀번호 변경
ALTER USER 아이디 IDENTIFIED BY 비밀번호;
  • ALTER USER~
  • 아이디 변경 불가

계정 삭제

DROP USER 사용자아이디;
  • 비밀번호 불필요
  • 삭제한 계정으로 로그인 불가

권한 관리

권한 부여

GRANT 권한명 TO 사용자아이디;
  • 계정생성 후 권한을 부여해야 해당 계정으로 로그인 가능

권한 회수

REVOKE 권한명 FROM 사용자아이디;


사용자 명령

테이블 관리

테이블 생성

CREATE TABLE 테이블명(1 타입(크기),2 타입(크기),
);
  • 테이블: 객체
  • 데이터 유형에 따라 공간(byte) 할당 필요
    - 저장 크기가 작을 수록 효율성이 높음
    - 저장될 데이터 크기의 최대치를 명시해 공간 낭비 방지
    - 공간을 정해두지 않고 자동으로 할당할 경우 추가 시간이 소요되어 성능 저하가 발생

데이터 유형(숫자/문자)

  • 숫자 NUMBER

    • 자릿수로 공간 지정
    • 미지정 시, 최대 38자리로 할당됨(INT 10자리)
    • 소수점 자리 수 지정: (총 N자리, 소수점 M자리)
    • 총 자리 수 모를 때 : *로 지정 number(*, 2)
  • 문자열 VARCHAR2

    • 가변 문자열: 최대 크기만 지키고 내부에서 자유롭게 사용
    • 효율성이 좋음
    • byte로 공간 지정. 한글: 3byte(나머지 1byte / UTF-8)
  • 문자열 CHAR

    • 고정 문자열: 무조건 지정된 크기를 꽉 채워서 저장
    • varchar2에 비해 속도가 매우 빠름
    • 성별, 날짜, 전화번호 등 문자열의 길이가 고정된 경우에 사용
    • CHAR의 최대 크기는 2000BYTE, VARCHAR2는 4000BYTE
  • 컬럼명에 예약어 사용 불가

테이블 변경

ALTER TABLE 테이블이름 ADD(컬럼명 형태)
ALTER TABLE 테이블이름 MODIFY(컬럼명 형태)
ALTER TABLE 테이블이름 DROP(컬럼명)
  • 컬럼 배치 순서 변경 불가

테이블 삭제

DROP TABLE 테이블이름;


데이터 관리

데이터 추가

INSERT INTO 테이블명(컬럼명1, 컬럼명2,...) VALUES(숫자, '문자열',...);
  • 데이터는 객체가 아님

    • 데이터는 객체와 명령이 다름
  • 가능한 표현

    • 입력할 칼럼의 개수와 값을 개수를 동일하게 입력
    • 입력할 테이블의 모든 컬럼을 입력할 경우, 입력할 컬럼 선언 생략 가능
    - no에 1, name에 이상해씨, type에 풀을 넣으세요(x)
    - no, name, type에 1,이상해씨, 풀을 넣으세요(o)
    - 1, 이상해씨, 풀을 넣으세요(o)

COMMIT

  • TRANSACTION: INSERT, UPDATE, DELETE
  • 트랜잭션의 처리 과정을 데이터베이스에 반영하기 위해, 변경된 내용을 모두 영구 저장
    • COMMIT 수행 시, 하나의 트랜잭션 과정을 종료하게 됨
    • TRANSACTION(INSERT, UPDATE, DELETE)작업 내용을 실제 DB에 저장
    • 이전 데이터가 완전히 UPDATE됨
  • 모든 사용자가 변경한 데이터의 결과를 볼 수 있음

ROLLBACK

  • 작업 중 문제가 발생했을 때, 트랜잭션의 처리 과정에서 발생한 변경 사항을 취소하고, 트랜잭션 과정을 종료시킴
  • 트랜잭션으로 인한 하나의 묶음 처리가 시작되기 이전의 상태로 되돌림
    • 마지막 COMMIT시점 이후의 작업을 취소함
  • TRANSACTION(INSERT, UPDATE, DELETE)작업 내용을 취소함

*https://wikidocs.net/4096


데이터 조회

  • 접속 > 테이블 > 테이블명 선택 > 데이터 탭 확인
  • 명령을 통한 조회(SQL)
    SELECT * FROM POCKET_MONSTER;


테이블 제약 조건

  • 데이터 저장, 수정 등에 반영할 특이사항에 대한 조건

CHECK

  • 원하는 값의 형태를 지정
    • 특정 컬럼의 입력 가능한 값의 범위를 지정
    • 조건에 맞지 않게 값 입력 시 에러 발생
      • ORA-02290: check constraint (KHACADEMY.SYS_C006998) violated
      • 테이블 > 제약 조건 탭에서 오류 발생 원인 확인 가능

  • 숫자 범위 지정: 비교 연산자 사용
    • AND, OR 사용

    • 이상/이하 범위에 BETWEEN 연산자 사용 가능

      PRICE NUMBER(10) CHECK(PRICE >= 0) -- 가격: 음수 불가
      KO NUMBER(3) CHECK(KO BETWEEN 0 AND 100) -- 점수: 이상/이하

  • 특정 값 지정
    • IN: 특정 값 여러 개 중 하나를 포함하는지 확인하는 연산자

      TELECOM CHAR(2) CHECK(TELECOM IN ('SK', 'KT', 'LG'))
  • 정규표현식 추가
    CHECK(REGEXP_LIKE(NICKNAME, '^[가-힣]{2,7}$')) //한글2~7자만 허용
  • 대소문자 무시 비교
    CHECK(UPPER(EVENT) = 'Y')
    -- EVENT를 모두 대문자화
    
    CHECK(LOWER(EVENT) = 'y')
    -- EVENT를 모두 소문자화

UNIQUE

  • 중복 금지 조건 지정

    NICKNAME VARCHAR(21) UNIQUE

NOT NULL

  • 필수값 조건 지정

    NICKNAME VARCHAR(21) NOT NULL

값 비교

  • =로 같음을 비교

    CHECK(EVENT = 'Y')

DEFAULT

  • 미입력 시 적용할 기본값 지정

    -- 조회수 기본값 0으로 설정
    BOARD_READ NUMBER DEFAULT 0 NOT NULL CHECK(BOARD_READ >= 0)


시퀀스(SEQUENCE)

  • ex. 번호 발급기: 중복 없음, 순서 존재
  • 중복 없는 번호 생성기
  • 데이터베이스 객체의 한 종류
  • 번호를 되돌릴 수 없음

시퀀스 생성

CREATE SEQUENCE 시퀀스명;
  • 생성 시, 옵션 지정 가능(거의 사용 안함)

번호 발급

  • 시퀀스에서 번호를 발급할 때는 .NEXTVAL 명령 사용
-- 시퀀스 생성
CREATE SEQUENCE TEST_SEQ;

-- 방명록 테이블 생성
CREATE TABLE GUEST_BOOK(
NO NUMBER UNIQUE NOT NULL,
NAME VARCHAR2(21) NOT NULL,
MEMO VARCHAR2(300)
); 

-- 시퀀스에서 번호를 발급할 때는 .NEXTVAL 명령 사용
INSERT INTO GUEST_BOOK(NO, NAME, MEMO)
VALUES(TEST_SEQ.NEXTVAL, '마리오', '잘 먹고 갑니다');

시퀀스 속성(옵션) 확인

SELECT * FROM USER_SEQUENCES;
  • MIN_VALUE: 시작할 최소 값

  • INCREMENT_BY: 증가 단위

  • CYCLE_FLAG: Y이면 MAX_VALUE까지 다 썼을 때 MIN_VALUE부터 다시 시작

  • ORDER FLAG: 시퀀스 여러 개 사용 시 우선순위 따짐 (사용할 일 없음)

  • CACHE_SIZE: 미리 뽑아둘 번호 개수

  • LAST_NUMBER: 이번에 뽑으면 몇 번이 나오는지

    • CACHE 때문에 내가 현재 발급한 숫자보다 크게 설정되어 있을 수 있음
    • CACHE: 성능향상을 위해 여유치를 두는 것 / 임시 저장
    • 번호도 미리 뽑아둔다고 생각하면 됨
  • 옵션을 부여해 시퀀스 생성(일반적으로 기본값을 사용)

    -- 1부터 1000까지 1씩 늘어나며 번호를 다 쓰면 순환하고 캐시는 없음
    CREATE SEQUENCE GUEST_BOOK_SEQ
    MINVALUE 1
    MAXVALUE 1000
    START WITH 1
    CYCLE -- <-> NOCYCLE
    NOCACHE; -- CACHE 20

0개의 댓글