13. 시퀀스 sequence
    : 테이블 내의 유일한 숫자(유일한 값)를 자동으로 생성하는 발생기 ---> 주로 primary key로 사용
    : 시작값, 증가치, 사이클, 최대값을 지정할 수 있음 +) 기본적으로 증가만 가능

 * 시퀀스 생성
      create sequence dept_deptno_seq      --시퀀스명: 테이블명_컬럼명_seq 형식을 따르는 게 일반적
            start with 10                               --start with: 시작값 (기본값=1, 지정 가능)
            increment by 10;                         --increment by: 증가치 (기본값=1, 지정 가능)

       select *from seq;                             --시퀀스 목록 확인 1
       select *from user_sequences;            --시퀀스 목록 확인 2

 * 시퀀스 적용
    currval: 시퀀스 현재값을 반환
    nextval: 시퀀스 다음값을 반환
       select dept_deptno_seq.nextval from dual; ---10, 20, 30... 마지막 출력된 그 다음값을 계속 반환
       select dept_deptno_seq.currval from dual; ---가장 마지막에 반환된 값=nextval로 찍힌 가장 최근값 반환

      01. 사용 가능한 곳
         - 서브 쿼리 아닌 select문
         - insert문의 select절, value절
         - update문의 set절
      02. 사용 불가능한 곳
         - view의 select절
         - distinct 키워드 있는 select문
         - group by, having, order by절 있는 select문
         - select, delete, update의 서브쿼리
         - create table, alter table 명령의 default값

       ex1. 시퀀스를 테이블의 기본키(primary key)에 적용
            --테이블 생성
                create table emp01 ( empno number(4) primary key, ename varchar2(10), hiredate date);
            --시퀀스 생성
                create sequence emp01_empno_seq; --옵션 모두 생략 ---> 시작값1, 증가치1 (default)
            --데이터 입력
                insert into emp01 values(emp01_empno_seq.nextval, 'Sirius', sysdate); --empno에 시퀀스 입력
               (주의! nextval이어야 다음값이 계속 반환됨, currval은 최근 반환값이 계속 반환되므로 중복이 됨 ---> primary key로 입력 불가)

       ex2. seq_ex2

         ---> seq로 deptno가 10에서 시작, 10씩 증가한 값이 입력되는 것을 확인할 수 있음


 * 시퀀스 삭제
       drop sequence dept_exp_seq;
       --시퀀스 삭제해도 기존에 사용한 곳은 값이 그대로 남아있음 ---> 시퀀스는 숫자를 부여만 하고, 부여된 이후에는 관련이 없기 때문에

 * 시퀀스 수정
       --시퀀스 생성
       create sequence dept_deptno_seq
           start with 10
           increment by 10
           maxvalue 30;    --최대값
       select dept_deptno_seq.nextval from dual;  ---네번 실행하면 오류 발생! 최대 30이라서! cycle도 없고!

       ---> maxvalue를 30에서 1000000으로 수정해야 함
       alter sequence dept_deptno_seq maxvalue 1000000;
       select dept_deptno_seq.nextval from dual;  ---최대값 수정되었으므로 40부터 다시 반환 시작!



14. 인덱스 index
    : 데이터를 더 빠르게 검색할 수 있음 ---> 인덱스가 없으면 각 쿼리의 전체 행을 스캔해야 하기 때문에
      인덱스는 키로 빌드됨 ---> 키는 테이블 또는 뷰의 열 등의 값으로 구성
    - 장점: 검색속도 빨라짐, 시스템 부하 감소 -> 전체 성능 향상
    - 단점: 추가공간 필요, 생성 시간 필요, 데이터변경(insert, update, delete)이 빈번하면 성능이 저하될 수 있음  

       select *from user_indexes;
       -- 기본키primary key가 설정된 컬럼은 자동으로 고유 인덱스가 만들어짐. unique -> 고유 인덱스


 * 인덱스 생성
    : 자동 생성되는 인덱스 외에 직접 생성도 가능함
       create index idx_emp01_ename on emp01(ename);   --인덱스명: idx_테이블_컬럼   on 테이블(컬럼)
    ---> 많은 데이터가 존재할 때 인덱스 생성하면 (처음 한 번) 생성 시간이 꽤 소요됨


 ※ 인덱스 유무에 따른 검색 속도 비교
       없을 때 -> 30.398초      있을 때 -> 0.135초

 * 인덱스 삭제
       drop index idx_emp01_ename;  --인덱스명으로 삭제!

 * 인덱스 종류
      01. 고유 인덱스 Unique Indexprimary key처럼 유일한 값을 갖는 칼럼에 적용할 수 있는 인덱스
           ---> unique 붙여서 생성해야 함 ex) create unique index index_name~ 
      02. 비교유 인덱스 NonUnique Index: 중복 데이터가 존재하는 칼럼에 적용할 수 있는 인덱스

   +) 고유, 비고유 인덱스 비교

     ----> 만약 고유 인덱스가 존재하는 곳에 중복 데이터를 입력한다면?
               insert into dept01 values(10, '인사과','대전')
               오류 보고 -
               ORA-00001: unique constraint (SCOTT.IDX_DEPT01_DEPTNO) violated

     ----> 중복 데이터가 존재하는 곳에 고유 인덱스를 생성한다면?
               create unique index idx_dept01_loc on dept01(loc)
               오류 보고 -
               ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found
               01452. 00000 -  "cannot CREATE UNIQUE INDEX; duplicate keys found"

      03. 단일 인덱스 Single Index : 한 개의 컬럼으로 구성한 인덱스 (지금까지 만든 인덱스들...)
      04. 결합 인덱스 Composite Index : 둘 이상의 컬럼으로 구성한 인덱스
           create index idx_dept01_com on dept01(deptno, dname);
      05. 함수 기반 인덱스 Function Based Index: 컬럼명 자리에 수식이나 함수를 넣어 구성한 인덱스
           create index idx_emp01_annsal on emp(sal*12);  --괄호 안에 함수(수식) 포함!


15. 사용자 관리

 * DB 보안을 위한 권한
    : 권한이란, 사용자가 특정 테이블에 접근할 수 있도록 하거나 해당 테이블에 SQL문을 적용할 수 있도록 제한을 두는 것

 ※ !주의! 권한은 주로 dba에 의해 부여되므로 -> 이 파트는 system계정으로 접속해서 진행해야 함!

      01. 시스템 권한: 사용자 생성, 제거, DB 접근 및 각종 객체 생성 권한 등 주로 dba에 의해 부여되는 것
           ex) create user(사용자 생성), drop user(사용자 삭제) etc.
           참고- 사용자 생성: create user ID identified by PW;   -- (create user user01 identified by tiger;)
        - 시스템 관리자가 일반 사용자(user)에게 부여하는 권한 (grant 명령어 이용)
            - create session: 데이터베이스 접속 권한
            - create table: 테이블 생성 권한
            - create view: 뷰 생성 권한
            - create sequence: 시퀀스 생성 권한
            - create procedure: 프로시저(함수) 생성 권한

    ---> 정리: 사용자 생성하고 권한을 부여(GRANT)해야 비로소 그 계정을 사용할 수 있다!
          ex) grant create session to user01; --DB 접속 권한 부여
               grant create session, create table, create view to user01; --콤마(,)로 권한 여러 개 부여 가능
               (나중에는 롤로 한꺼번에 권한 부여하게 됨)

         - with admin option : 시스템 권한을 부여할 때 이 옵션을 추가하면, 권한을 부여받은 사용자는 DBA가 아니지만, 다른 사용자에게 자신이 부여받은 시스템 권한을 부여할 수 있음
            (예를 들면 카페지기가 운영자 임명하고 그 운영자가 게시판지기 임명하는 그런 느낌)
          ex) grant create session to user02 with admin option;


      02. 객체 권한: 특정 객체를 조작할 수 있는 권한. 기본적으로 객체의 소유자는 객체에 대한 모든 권한을 가짐
           : 테이블, 뷰, 시퀀스, 함수 등 객체 별로 DML문을 사용할 수 있는 권한을 설정

 출처  https://techgoeasy.com/create-user-system-privileges-object-privileges/


         ex. 새로 생성된 user01 계정에게 scott 계정 소유의 emp테이블 객체에 대한 권한(select)을 부여

         conn scott/tiger;
              grant select on emp to user01;

         ex. user01 계정으로 접속 후 emp 테이블에 대해 select 실행 (단, 다른 계정이니까 scott.emp로 표시)

              conn user01/tiger;
              select*from scott.emp;


         권한 취소 (REVOKE)
            : 사용자에 부여한 객체 권한을 철회
              revoke select on emp from user01;

         - with grant option : 객체 권한을 부여할 때 이 옵션을 추가하면, 권한을 부여받은 사용자는 다른 사용자에게 자신이 부여받은 객체 권한을 부여할 수 있음
          ex) grant select on emp to user02 with grant option;



16. 롤 role
    : 권한 그룹 관리 ---> 사용자가 효율적으로 권한을 부여할 수 있도록 여러 권한을 묶어놓은 것
    : create, grant, revoke 기본적으로 system 계정에서 작업하고, 객체 권한 부여 등 특정 상황에만 그 계정에서 작업!


 * 시스템 제공 롤
    - connect 
        : 가장 기본적인 시스템 권한   ~8개
          alter session, create cluster, create database link, create sequence, create session, create synonym, crate table, create view
    - resource 
        : 객체(table, view, index) 생성할 수 있는 시스템 권한   ~20여 개
          create cluster, create procedure, create sequence, create table, create trigger etc.
    - dba 
        : 데이터베이스 관리자(DBA)로서의 권한(시스템 관리에 필요한 모든 권한)   ~130여 개

    - grant connect, resource to user04; 


 * 사용자 정의 롤
   : 기본 제공되는 롤 외에, 사용자가 직접 묶어 정의한 롤
          create role role_name;                    --롤 생성하고
          grant privilege_name to role_name;    --생성한 롤에 원하는 권한을 부여
    - 시스템 권한

    - 객체 권한
       ---> 객체 권한 부여할 때는 그 객체를 소유한 계정으로 부여해야 함! 딱 이 때만! 주의!!!


 * 롤 회수 : 특정 계정한테서 권한을 회수하는 것
    - revoke mrole, mrole02 from user05;

 * 롤 삭제 : 롤 자체를 삭제
    - drop role mrole;     --revoke는 여러 개 회수 가능한데, 삭제는 하나씩만 가능하더라 참고!


 * 디폴트 롤시스템권한+객체권한

---> 디폴트 롤 부여된 여러 계정에 권한이 부여되었음을 확인 (create session+grant select)

+ Recent posts