OpenFrameWork

오픈프레임워크_Day25

px 2015. 4. 20. 11:57
### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도

목차. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
***. TRANSACTION - 작업단위
ALL OR NOTHING - 하거나, 말거나

왜 이런 것이 필요 할까?
금융권에서 이런 전산 작업이 필요했었음

1. A은행 입금
2. A은행에서 출금된 돈
3. 그 돈이 B은행으로 입금

이런 과정을 하나의 작업단위로 볼 수 있는데
2번을 하던 과정에 문제가 발생했을때
원래 상태로 돌려놓아야함

이런한 일을위해서 트랜잭션이 필요함

트랜잭션은 어떻게 할 수 있나?
원래 상태로 돌리는 방법은?
-> 작업에 대한 내용을 저장하는 정보가 필요
-> 그게 "트랜잭션 로그"
@@@트랜잭션 로그, TRANSACTION LOG, 트랜잭션로그, TRANSACTIONLOG

1. 데이터베이스
          1) 데이터 파일 : .DBF
          2) 로그 파일 : .LOG  -> 트랜잭션에서 사용

오라클의 경우
F:\app\jhta\oradata\orcl\~.DBF
F:\app\jhta\oradata\orcl\~.LOG

2. 명령어
          1) COMMIT - TRANSACTION을 완료 시(되돌릴 수 없음, COMMIT전에는 메모리에서만 작업, 실제파일에 저장)
          2) ROLLBACK - 시작위치로 되돌림
          ...

COMMIT을 하지 않고 재접속 하면 INSERT한 내용이 없어짐
COMMIT을 하면 저장이 되서 재접속 해도 사라지지 않음

COMMINT을 하고
UPDATE TBLBOOK SET TITLE='하늘' WHERE TITLE='하늘과 땅';
ROLLBACK 하면 사라짐


3. 동기화 처리
하나의 서버에 두명이 접속, A,B로 구분
A. SELECT *FROM TBLBOOK;
B. SELECT *FROM TBLBOOK;
A. UPDATE TBLBOOK SET TITLE='하늘과 땅' WHERE TITLE='하늘';
A. SELECT *FROM TBLBOOK;
B. SELECT *FROM TBLBOOK;
두명의 내용이 다름
이럴때 COMMIT해주면 됨
A. COMMIT

COMMIT 하기 전까지는 서로 보는 데이터가 다르기 때문에
동기화 되도록 COMMINT을 주기적으로 해야 한다

4. DML에만 해당
-----------------------------------
***. DATA INTEGRITY - 데이터 무결성
정확한 데이터만 저장해서 신뢰할 수 있는 데이터로 만들자라고 해서 시작한 주제
데이터를 안전하게 보호하고 결점이 없는 데이터로 만들려고 하는 것

이러한 무결성을 위해서 어떤 노력을 할 것인가?

1. 무엇을 지킬 것인가?, 어떻게 지킬 것인가?

2. WHAT?
          1) 실체 무결성 (ENTITY INTEGRITY) - ENTITY => TABLE, 하나의 테이블 안에서 발생
                    - 데이터 중복제거(중복된 데이터로 인한 연쇄적인 문제를 위해 미리 제거)
                    - PRIMARY KEY, UNIQUE => CONSTRAINT(제약)
          2) 영역 무결성 (DOMAIN INTEGRITY) - 하나의 테이블 안에서 발생
                    - 범위(영역),정해진 범위내에서 데이터를 사용하게
                    - CHECK
          3) 참조 무결성 (REFERENCE INTEGRITY) - 두개 이상의 테이블에서 발생
                    - 참조를 지킨다
                    - FOREIGN KEY(외래키,참조키) - 실제 비교가 필요한 곳(참조하는 테이블)에 필드에 KEY가 사용됨
                    - 참조하는 테이블(자식테이블), 참조 당하는 테이블(부모테이블), 참조테이블(자식테이블,참조하는 테이블)

3. 컬럼(필드) 속성
          1) NN(NOT NULL) 속성
               - PRIMARY KEY, NOT NULL(자체 기능,제약 아님)
          2) ND(NO DUPLICATE) 속성
               - UNIQUE, PRIMARY KEY
          3) NC(NO CHANGE) 속성 - 수정불가
               - FOREIGN KEY

4. PRIMARY KEY => UNIQUE + NOT NULL 
          1) 하나의 테이블에서 유일하게 레코드를 구별 할 수 있게 해주는 키
          2) NULL 허용하지 않음
          3) 하나의 테이블에 한개만 설정가능
          4) 여러개의 필드에 설정이 가능(여러개의 필드를 묶어서 사용가능)

5. UNIQUE
          1) 중복을 허용하지 않음
          2) 하나의 테이블에 여러 개의 키가 존재할 수 있다.

6. SEQUENCE
          1) 절대로 중복되지 않는 정수를 가져다 사용하는 방법(자동 증가, 어떤 숫자가 나올지 모름)
          2) CREATE SEQUENCE ...
          3) 독립된 객체로 사용(다른 테이블들도 쓸 수 있음)
          4) mysql의 경우 autoincrement라는 키워드를 테이블 객체에 종속된다.
          5) mssql의 경우 idendtity라는 키워드로 테이블 객체에 종속시켜 사용함.

7. DEFAULT -> NULL 값 대신에 기본값을 넣겠다
          1) 필드 옆에 작성함으로써 테이블에 종속됨

8. CHECK -> 정해진 값 이외에 다른 값은 막아 주겠다
          1) 정해진 범위안에 데이터를 검사

-----------------------------------
테이블에 저장하는 DB -> 관계형 DB
하나의 테이블이 아닌 다른 테이블과의 관계가 발생함
똑같은 필드가 있느냐? 같은 필드를 공유하고 있느냐?
-----------------------------------
***. 테이블 만드는 방법
          CREATE TABLE 테이블명(
                    필드명     데이터타입     [NULL(DEFAULT)| NOT NULL] CONSTRAINT,
                    ...
          );

          *. 데이터 타입
                    NUMBER(자리수) : 숫자
                    DATE : 날짜
                    VARCHAR2(자리수) : 문자(가변길이) - (10)인데 2개 저장하면 크기가 2개 됨
                    CHAR(자리수) : 문자(고정길이)
-----------------------------------
***. 기본키 실습
테이블 생성
DROP TABLE TBLTEST;
CREATE TABLE TBLTEST(
          ID         NUMBER           NULL,
          NAME       VARCHAR2(10)     NULL
);

중복된 데이터 입력 가능할까?
INSERT INTO TBLTEST VALUES(1, '홍길동');
INSERT INTO TBLTEST VALUES(1, '홍길동');

SELECT * FROM TBLTEST;

        ID NAME
---------- ----------
         1 홍길동
         1 홍길동

DELETE FROM TBLTEST;
레코드 전부 삭제됨


테이블에 기본키 제약 설정 - 데이터를 다 지우고 해야 가능
ALTER TABLE TBLTEST
ADD CONSTRAINT PK_ID PRIMARY KEY(ID);

INSERT INTO TBLTEST VALUES(1, '홍길동');
1 개의 행이 만들어졌습니다.
INSERT INTO TBLTEST VALUES(1, '홍길동');
INSERT INTO TBLTEST VALUES(1, '홍길동')
*
1행에 오류:
ORA-00001: 무결성 제약 조건(SCOTT.PK_ID)에 위배됩니다


-----------------------------------
**. DD(DATA DICTIONARY) - 테이블의 정보를 담고 있는 테이블
이를 이용해서 프로그래밍이 가능하다

DESC USER_CONSTRAINTS ;

이름                                      널?      유형
----------------------------------------- -------- ------------
OWNER                                              VARCHAR2(30)
CONSTRAINT_NAME                           NOT NULL VARCHAR2(30)
CONSTRAINT_TYPE                                    VARCHAR2(1)
TABLE_NAME                                NOT NULL VARCHAR2(30)
SEARCH_CONDITION                                   LONG
R_OWNER                                            VARCHAR2(30)
R_CONSTRAINT_NAME                                  VARCHAR2(30)
DELETE_RULE                                        VARCHAR2(9)
STATUS                                             VARCHAR2(8)
DEFERRABLE                                         VARCHAR2(14)
DEFERRED                                           VARCHAR2(9)
VALIDATED                                          VARCHAR2(13)
GENERATED                                          VARCHAR2(14)
BAD                                                VARCHAR2(3)
RELY                                               VARCHAR2(4)
LAST_CHANGE                                        DATE
INDEX_OWNER                                        VARCHAR2(30)
INDEX_NAME                                         VARCHAR2(30)
INVALID                                            VARCHAR2(7)
VIEW_RELATED                                       VARCHAR2(14)

SELECT CONSTRAINT_NAME, TABLE_NAME,
STATUS FROM USER_CONSTRAINTS;

CONSTRAINT_NAME                TABLE_NAME                     STATUS
------------------------------ ------------------------------ -------
FK_DEPTNO                      EMP                            ENABLED
PK_DEPT                        DEPT                           ENABLED
PK_EMP                         EMP                            ENABLED
PK_ID                          TBLTEST                        ENABLED

DESC USER_OBJECTS;

이름                                      널?      유형
----------------------------------------- -------- --------------
OBJECT_NAME                                        VARCHAR2(128)
SUBOBJECT_NAME                                     VARCHAR2(30)
OBJECT_ID                                          NUMBER
DATA_OBJECT_ID                                     NUMBER
OBJECT_TYPE                                        VARCHAR2(19)
CREATED                                            DATE
LAST_DDL_TIME                                      DATE
TIMESTAMP                                          VARCHAR2(19)
STATUS                                             VARCHAR2(7)
TEMPORARY                                          VARCHAR2(1)
GENERATED                                          VARCHAR2(1)
SECONDARY                                          VARCHAR2(1)
NAMESPACE                                          NUMBER
EDITION_NAME                                       VARCHAR2(30)

SELECT OBJECT_NAME FROM USER_OBJECTS;

OBJECT_NAME
------------------------------------------
PK_DEPT
DEPT
EMP
PK_EMP
BONUS
SALGRADE
TBLA
TBLB
TBLC
TBLTEST
TBLBOOK
PK_ID


기본키 제약 제거
ALTER TABLE TBLTEST
DROP CONSTRAINTS PK_ID;

SELECT CONSTRAINT_NAME, TABLE_NAME,
STATUS FROM USER_CONSTRAINTS;

CONSTRAINT_NAME                TABLE_NAME                     STATUS
------------------------------ ------------------------------ -------
FK_DEPTNO                      EMP                            ENABLED
PK_EMP                         EMP                            ENABLED
PK_DEPT                        DEPT                           ENABLED
PK_ID가 삭제 된것을 볼 수 있음


테이블에 컬럼을 추가
ALTER TABLE TBLTEST
ADD AGE NUMBER NULL;

DESC TBLTEST;

이름                                      널?      유형
----------------------------------------- -------- ------------
ID                                                 NUMBER
NAME                                               VARCHAR2(10)
AGE                                                NUMBER

컬럼 수정
20글자까지 지정

ALTER TABLE TBLTEST
MODIFY NAME VARCHAR(20);

이름                                      널?      유형
----------------------------------------- -------- ------------
ID                                                 NUMBER
NAME                                               VARCHAR2(20)
AGE                                                NUMBER

DESC TBLTEST;

컬럼 삭제
ALTER TABLE TBLTEST DROP COLUMN AGE;

만약 ID에 기본키를 줬는데 ID가 중복이 가능하다면
두개의 필드로 묶어서 사용 가능

두개의 필드를 묶어서 기본키 설정
ALTER TABLE TBLTEST
ADD CONSTRAINTS PK_ID PRIMARY KEY(ID, NAME);

SQL> ALTER TABLE TBLTEST
  2  ADD CONSTRAINTS PK_ID PRIMARY KEY(ID, NAME);

테이블이 변경되었습니다.

SQL> DESC TBLTEST;
이름                                      널?      유형
----------------------------------------- -------- ------------
ID                                        NOT NULL NUMBER
NAME                                      NOT NULL VARCHAR2(20)
AGE                                                NUMBER

SELECT * FROM TBLTEST;
ID NAME                        AGE
--- -------------------- ----------
  1 홍길동

INSERT INTO TBLTEST VALUES(1,'임꺽정',24);

SQL> INSERT INTO TBLTEST VALUES(1,'임꺽정',24);

1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM TBLTEST;

        ID NAME                        AGE
---------- -------------------- ----------
         1 홍길동
         1 임꺽정                       24

DROP TABLE TBLTEST;

CREATE TABLE TBLTEST(
          ID         NUMBER           NOT NULL     PRIMARY KEY,
          NAME       VARCHAR2(10)     NULL,
          AGE        NUMBER
);

SELECT CONSTRAINT_NAME, TABLE_NAME,
STATUS FROM USER_CONSTRAINTS;

CONSTRAINT_NAME                TABLE_NAME                     STATUS
------------------------------ ------------------------------ -------
FK_DEPTNO                      EMP                            ENABLED
SYS_C0011134                   TBLTEST                        ENABLED
SYS_C0011133                   TBLTEST                        ENABLED
BIN$yLUL8oLmREuVovbkQZNSuQ==$0 BIN$lh8WM+gkSIaq8PLqHr81Sg==$0 ENABLED
PK_EMP                         EMP                            ENABLED
PK_DEPT                        DEPT                           ENABLED

이름이 이상함, 삭제도 힘들수 있음, 좋은 방법이 아님

DROP TABLE TBLTEST;

CREATE TABLE TBLTEST(
          ID         NUMBER           NOT NULL     CONSTRAINT PK_ID PRIMARY KEY,
          NAME       VARCHAR2(10)     NULL,
          AGE        NUMBER
);

SELECT CONSTRAINT_NAME, TABLE_NAME,
STATUS FROM USER_CONSTRAINTS;

CONSTRAINT_NAME                TABLE_NAME                     STATUS
------------------------------ ------------------------------ -------
FK_DEPTNO                      EMP                            ENABLED
PK_ID                          TBLTEST                        ENABLED
SYS_C0011135                   TBLTEST                        ENABLED
BIN$wFcJ9pKASV+A1Z8KAx6RjA==$0 BIN$bSHA6zszQ3uoUTHC1m6L3g==$0 ENABLED
BIN$IqMftt1mRg6z0/VYxzXypg==$0 BIN$bSHA6zszQ3uoUTHC1m6L3g==$0 ENABLED
BIN$yLUL8oLmREuVovbkQZNSuQ==$0 BIN$lh8WM+gkSIaq8PLqHr81Sg==$0 ENABLED
PK_EMP                         EMP                            ENABLED
PK_DEPT                        DEPT                           ENABLED

PK_ID 생김


위 방법보다 더 권장하는 방법
DROP TABLE TBLTEST;
CREATE TABLE TBLTEST(
          ID         NUMBER           NOT NULL,
          NAME       VARCHAR2(10)     NULL,
          AGE        NUMBER,
          CONSTRAINT PK_ID PRIMARY KEY(ID,NAME)
);


NN 속성
DROP TABLE TBLTEST;
CREATE TABLE TBLTEST(
          ID         NUMBER           CONSTRAINT PK_ID PRIMARY KEY,
          NAME       VARCHAR2(10)     NULL,
          AGE        NUMBER         
);

INSERT INTO TBLTEST(ID,NAME) VALUES(NULL,'홍길동'); X
INSERT INTO TBLTEST(NAME) VALUES('홍길동'); X
-----------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
###################################
2. 설정 및 그 밖에
-----------------------------------
-----------------------------------
-----------------------------------
-----------------------------------
###################################
3. 소스코드 또는 실습
-----------------------------------
----------------------------------- 
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
-----------------------------------
-----------------------------------