시퀀스와 동의어
중복되지 않는 번호를 만들어 주는 시퀀스의 생성, 사용, 변경과 캐시 설정, 다른 사용자의 객체를 스키마 이름 없이 부르게 하는 동의어
#핵심 요약
시퀀스는 테이블에 중복되지 않는 유일한 번호가 항상 들어가도록 하는 DB 객체임
주문번호처럼 중복되면 안 되는 번호에 씀
CREATE SEQUENCE 이름 START WITH n INCREMENT BY n MAXVALUE n으로 만들고 이름.NEXTVAL로 다음 값을 받음
ALTER SEQUENCE로 MAXVALUE, INCREMENT BY를 바꿀 수 있지만 START WITH는 바꿀 수 없음
동의어는 CREATE SYNONYM emp FOR scott.emp처럼 다른 스키마 객체에 짧은 이름을 붙임PUBLIC SYNONYM은 모든 사용자가 쓸 수 있음
#개념과 동작 원리
실습(캐시): NOCACHE로 만든 시퀀스 seq8에서 1, 2, 3을 받은 뒤 SHUTDOWN ABORT와 STARTUP을 하고 다시 받으니 4가 나왔음
실습 속성 메모에는 "DB 내릴 때 조심(캐시)"라고 적혀 있음
캐시를 쓰는 시퀀스는 인스턴스가 비정상 종료되면 캐시에 있던 번호를 잃어 번호가 건너뛸 수 있다는 뜻으로 보이나, 캐시 시퀀스 쪽 결과는 기재 없음
시퀀스의 CACHE, ORDER와 RAC 채번 성능은 시퀀스와 채번 성능에서 다룸
#필수 명령어 또는 SQL
#시퀀스
CREATE SEQUENCE dept_seq
START WITH 50
INCREMENT BY 10
MAXVALUE 200;
INSERT INTO dept (deptno, dname, loc)
VALUES (dept_seq.NEXTVAL, 'aaa', 'bbb');SELECT * FROM user_sequences;
SELECT seq1.NEXTVAL FROM dual;결과 해석: NEXTVAL을 부를 때마다 50, 60, 70 ... 순으로 다음 값이 나옴
조회에서 NEXTVAL을 불러도 번호는 소비됨
CREATE SEQUENCE seq8
START WITH 1
INCREMENT BY 1
MAXVALUE 100
NOCACHE;
ALTER SEQUENCE seq1 MAXVALUE 1000;결과 해석:
실습 기록: seq8은 1, 2, 3 다음 인스턴스 비정상 종료와 재시작 뒤 4였음
실습에서는 SYS로 SHUTDOWN ABORT를 실행했음
이 작업은 인스턴스를 즉시 내리는 운영 중단 작업이라 실습 DB에서만 함
#동의어
CREATE SYNONYM emp FOR scott.emp;결과 해석:
실습에서는 SCOTT의 모든 테이블에 동의어를 만들려고, SCOTT에서 생성 문장을 만들어 다른 계정에서 실행했음
SELECT 'CREATE SYNONYM ' || LOWER(table_name) ||
' FOR SCOTT.' || LOWER(table_name) || ';'
FROM user_tables;SELECT COUNT(*) FROM user_synonyms;결과 해석:
실습 기록: 만든 동의어는 69개였음
동의어로 조회하려면 원래 객체의 조회 권한도 있어야 함(권한 부여 문장 확인 불가)
실습 이수자 평가 과제: 새 계정에서 SCOTT의 모든 테이블을 scott. 접두어 없이 조회하게 하기