학원 40일차 - Oracle

2021.05.24

ex25_alter.sql

DDL

  • 객체 생성 : create
  • 객체 삭제 : drop
  • 객체 수정 : alter

DML

  • 데이터 생성 : insert
  • 데이터 삭제 : delete
  • 데이터 수정 : update

테이블 수정하기, alter table

  • 테이블 구조 수정하기 > 컬럼 정의 수정하기
  • 되도록 테이블을 수정하는 상황이 발생하면 안된다(★★★★★★)
  1. alter 사용 > 기존 테이블의 구조를 변경
    a. 기존 테이블에 데이터 없었을 경우 > 빈테이블 > 아무일 없음
    b. 기존 테이블에 데이터 있었을 경우 > (손상이 될 수 있으니까)미리 데이터를 백업한다. > 수정 > 변수
    - 서비스 운영 중 사용

  2. 테이블 삭제 > 테이블 생성
    a. 기존 테이블에 데이터 없었을 경우 > 빈테이블
    b. 기존 테이블에 데이터 있었을 경우 > 미리 데이터 백업 > 테이블 삭제 > 테이블 생성 > 데이터 복구

    • 서비스 운영 중 사용
    • 개발 중에 사용

테이블 수정하기

  1. 새로운 컬럼 추가하기 : 무난 + 고민(X)
  2. 기존 컬럼 삭제하기 : 무난 + 고민(데이터 삭제, FK - 테이블간의 관계)
  3. 기존 컬럼의 정의 수정하기: 고민 많이 할 것!! (★★★)
    • 컬럼명 바꾸기 : 무난 + 고민(기존 데이터x, 기존 쿼리..)
    • 컬럼의 길이 바꾸기 : 무난 + 고민(기존 데이터의 길이)
    • 컬럼의 자료형 바꾸기 : 무난 + 고민(기존 데이터)
    • 컬럼의 제약사항 바꾸기 : 무난 + 고민(기존 데이터)
drop table tblEdit;

-- 테이블 생성
create table tblEdit(
    seq number primary key,
    data varchar2(20) not null
);


insert into tblEdit values (1, '마우스');
insert into tblEdit values (2, '키보드');
insert into tblEdit values (3, '모니터');

select * from tblEdit;

1. 새로운 컬럼 추가하기
-- 1. 새로운 컬럼 추가하기 > price (가격) 컬럼 추가
-- alter table tblEdit add (추가 컬럼 정의);
alter table tblEdit 
    add (price number(5) null); -- null 컬럼 추가

-- null -> optional
-- not null -> mandatory

-- ORA-01758: table must be empty to add mandatory (NOT NULL) column
-- not null 컬럼을 만들려면 테이블을 비우거나, default값을 가져야한다.
-- alter table tblEdit
--    add(description varchar2(100) not null); -- not null 컬럼 추가

-- not null컬럼을 만드는 방법 1) default값을 갖는다.
alter table tblEdit
    add(description varchar2(100) default '임시' not null); -- not null 컬럼 추가

-- 방법2) 테이블을 비우기 > 데이터를 잘 보관하고 있어야한다.(inset문 잘 보관하기)
delete from tblEdit; -- 데이터 지우기

alter table tblEdit
    add(etc varchar2(100) not null); -- not null 컬럼 추가

select * from tblEdit;

2. 기존 컬럼 삭제하기
-- 2. 기존 컬럼 삭제하기
-- alter table 테이블명 drop column 지울컬럼명;
alter table tblEdit
    drop column etc;
    
alter table tblEdit
    drop column description;
    
alter table tblEdit
    drop column seq;  -- 심각하게 고민...PK > 되도록 금지!!!   
3. 기존 컬럼의 정의 수정하기
-- 3. 기존 컬럼의 정의 수정하기 
select * from tblEdit;

-- 새로운 항목 추가
-- SQL 오류: ORA-00947: not enough values
insert into tblEdit values (4, '올해 새롭게 출시된 초경량 노트북');

-- 3.a 컬럼의 길이 수정하기(확장, 축소)
-- alter table tblEdit modify(컬럼 정의);

-- 확장
alter table tblEdit
    modify (data varchar2(100));

-- 축소
alter table tblEdit
    modify (data varchar2(50));

desc tblEdit;


-- 3.b 컬럼의 자료형 바꾸기
select * from tblEdit;

-- 숫자에서 문자로 (데이터는 지장이 없음)
-- ORA-01439: column to be modified must be empty to change datatype
delete from tblEdit; -- 테이블을 비워야함..!

alter table tblEdit
    modify (seq varchar2(100));
    
desc tblEdit; -- 확인
    
    
-- 3.c 제약사항 바꾸기
-- alter table tblEdit modify (컬럼 정의 바꾸고싶은제약);
alter table tblEdit
    modify (data varchar2(20) null);
    
desc tblEdit;    
    

-- 3.d 컬럼명 바꾸기
alter table tblEdit
    rename column data to name; -- data -> name으로 바꾸기
기존 테이블 + 기존 컬럼에 새로운 제약 사항 추가하기
desc tblEdit;

alter table tblEdit
    add (color varchar2(100) null);
    
select * from tblEdit;    

-- check 제약 추가
alter table tblEdit
    add constraint tbledit_color_ck check (color in ('red', 'yellow', 'blue'));
    
insert into tblEdit values (4, '핸드폰', 'yellow');
insert into tblEdit values (5, '태블릿', 'black');
-- 테이블 외부에 제약사항 추가하기★★ -> 가독성높음.
-- not null은 외부에서 넣는 것 불가.

create table tblEdit2(
    seq number, -- PK넣기
    data varchar2(30) not null, -- ck넣기
    pseq number not null -- FK넣기
)    

alter table tblEdit2
    add constraint tbledit2_seq_pk primary key(seq);
    
alter table tblEdit2
    add constraint tbledit2_data_ck check(length(data) >= 5);

alter table tblEdit2
    add constraint tbledit2_pseq_fk foreign key(pseq) references tblEdit(seq);
    
alter table tblEdit2
    drop constraint tbledit2_pseq_fk; -- 제약 삭제.

ex26_account.sql

계정

  • DCL
  • 계정 생성
  • 리소스 접근 권한 제어

사용자 계정 생성하기

  • 시스템 권한을 가지고 있는 계정만 할 수 있다.
    • 관리자만 가능(sys, system, 관리자 권한을 부여받은 계정 등)
    • 계정 생성 권한을 가지는 일반 계정
create user 계정명 identified by 암호;
alter user 계정명 indentified by 암호;
alter user 계정명 account lock;
alter user 계정명 account unlock;
drop user 계정명;
show user;

-- ORA-01031: insufficient privileges
-- 계정 생성 권한이 있어야 가능함..
create user hong identified by java1234; -- unlock상태

-- 계정 권한 조작
-- 1. grant 권한 to 계정
-- 2. revoke 권한 from 계정


-- 권한
-- 1. 권한
-- 2. 롤(Role) : 권한의 집합 


-- grant create session to hong; -- 단일 권한 부여
grant connect, resource to hong; -- 롤(수많은 권한 집합), 가장 흔한 롤 부여
grant create view to hong; -- 뷰 만들 수 있는 권한 부여


show user;
select * from tabs;

ex27_transaction.sql

트랜잭션, transaction

  • 트랜잭션 개념
  • 오라클에서 트랜잭션을 처리(조작)하는 방법
  • 오라클에서 발생하는 1개 이상의 명령들을 하나의 논리 집합으로 묶어 놓은 단위 > (실행된)명령어들의 집합 > 통제(제어)
  • 트랜잭션에 포함되는 명령어 > insert, update, delete > 테이블 조작(변경)

트랜잭션 명령어

  • DCL(TCL)

  • 하나의 트랜잭션으로 묶여있는 DML들을 감시하다가, 일부 DML에서 문제가 발생하면 이전에 성공한 모든 DML을 어떻게 처

    1. commit

    2. rollback

    3. savepoint

새로운 트랜잭션이 시작하는 경우

1.클라이언트가 접속한 직 후 > 세션 시작 직 후

  1. commit 실행 직 후
  2. rollback 실행 직 후

현재 트랜잭션이 종료되는 경우

  1. commit 실행 직 후
  2. rollback 실행 직 후
  3. 클라이언트가 접속을 종료하는 경우
  4. DDL을 실행하는 경우(create, alter, drop) -> 자동으로 commit이 호출된다. (Auto commit)
    • 구조를 바꾸는 작업이라 데이터를 완전 처리하는 작업을 내장
drop table tblTrans;

create table tblTrans
as
select name, city, buseo, jikwi from tblInsa where buseo = '개발부';

-- 클라이언트 접속함(hr)
select * from tblTrans;

delete from tbltrans where name = '김신애'; -- 트랜잭션에 포함

select * from tbltrans;

rollback; -- 자신이 포함된 트랜잭션을 시작한 처음으로 돌아가라 (delete를 하기 전 시점으로 돌아감(그동안 했었던 작업들은 소멸됨))
-- 또 새로운 트랜잭션이 자동으로 시작된다.

select * from tbltrans; -- 김신애가 살아남.

delete from tbltrans where name = '임수봉';
update tblTrans set city = '서울' where name = '이순애';
insert into tblTrans values ('하하하', '서울', '개발부', '사원');

select * from tblTrans;

rollback;

select * from tblTrans;


delete from tbltrans where name = '임수봉';

select * from tblTrans; 

-- 오라클 강제 종료
-- 오라클 재시작
select * from tblTrans;  -- 삭제했던 임수봉이 삭제가 안되어있음. -> DB에 반영이 안되어있음

delete from tbltrans where name = '임수봉';
select * from tblTrans; 

commit; -- 모든 작업을 데이타 베이스에 저장해라

select * from tblTrans; -- 임수봉 삭제되어있음.

-- 둘 다 한번 실행하면 취소 불가능.
rollback; -- 현재 트랜잭션의 모든 작업을 없었던 일로..
commit; -- 현재 트랜잭션의 모든 작업을 실제 데이터베이스(오라클)에 적용해라..

delete from tblTrans;
select * from tbltrans;

rollback;

select * from tbltrans;

-- 내가 한 실수를 되돌릴 수 있도록 하는 안전장치


-- 트랜잭션 선택
-- 1. 사용
-- 2. 미사용





select * from tblTrans;
delete from tbltrans;

rollback;

-- commit 발생 -> 4. DDL을 실행하는 경우(create, alter, drop)
create or replace view vwCountry
as
select * from tblCountry;



/*

commit, rollback 어떻게 제어?
1. 주기
  - 어느 정도 자주 호출해야 하는가?
  - 논리적 작업 단위(스스로 선택)
  
*/


-- savepoint
commit;
rollback;


delete from tbltrans where name = '김신애';

select * from tbltrans;

savepoint a;

delete from tbltrans where name = '황진이';

savepoint b;

delete from tbltrans where name = '홍길남';

-- 현재
rollback;
rollback to b;
rollback to a;
commit;

select * from tbltrans;

좋은 웹페이지 즐겨찾기