레이블이 테이블인 게시물을 표시합니다. 모든 게시물 표시
레이블이 테이블인 게시물을 표시합니다. 모든 게시물 표시

2015년 10월 30일 금요일

151012 - DB 의 정규화 / 팀프로젝트

데이터 모델링
---------------------
미팅 
요구사항 수집
요구사항 정리
         -ERD(Entity Relation Diagram)
               -개념적 설계
               -논리적 설계 : 개념적 설계 + 테이블 사상
               -물리적 설계 : 실제 DBMS
구현
디버깅
납품
유지보수
--------------
관계
-----
1. 1:1 관계
2. 1:다 관계(다 : 1관계)
3. 다:다 관계
------------
정규화
------
제1정규화
속성값은 반드시 원자값이어야 한다.

제2정규화
기본키가 복합 필드일 경우
모든 키가 아닌 컬럼은 기본키 전체에 의존적이어야 한다.
기본키의 일부분에 의존적이어서는 안된다.

제3정규화
키가 아닌 컬럼은 다른 키가 아닌 컬럼에 의존적이어서는 안된다.

제4정규화
다대다 관계

제5정규화

-----------------------------------------------------------

ERD 작성
1) 식별 관계
- 부모테이블의 기본키 가 자식테이블의 기본키 로 전이되는 관계
- 1 : 1
2) 비 식별 관계
- 부모테이블의 기본키 가 자식테이블의 일반컬럼 으로 전이되는 관계
- 1 : 多

-------------------------------------------------------------

DB프로젝트 산출물
-----------
1. 발표 ppt
- 조원소개
- 역할분담
- 실행화면 캡쳐(3개이상)
2. ERD
- 설계과정에 따른 변화물도 같이제출

3. UML
- CLASS Diagram
- Sequence Diagram
4. 소스
- java
- sql

5. 프로시저 작성시
- 프로시저 설계도(소스포함)
6. 테이블 스키마

*10개 문항을 테스트하여 통과 여부를 통해 조별점수 책정

151012 - 프로시저, 트리거, procedure, trigger

7. 이름을 입력받아 그 직원의 부서명과 급여를 검색하는 프로시저

CREATE OR REPLACE PROCEDURE usp_search(
p_ename IN emp.ename%type,
p_ename OUT dept.dname%type
p_sal OUT emp.sal%type)
IS 
BEGIN
SELECT dname, sal
FROM dept INNER JOIN emp
ON dept.deptno = emp.edptno AND upper (ename) = upper (p_ename);
END;
/

var g_dname varchar2(14)
var g_sal number

SELECT dname, sal
FROM dept INNER JOIN emp
ON dept.deptno = emp.edptno AND upper (ename) = 'scott;

exec usp_search('scott',:g_dname,:g_sal)
print :g_dname
print :g_sal
--------------------------------------------------------------------

8. 전화번호를 입력받아 다시 전화번호를 리턴하는 프로시저

CREATE OR REPLACE PROCEDURE usp_tel(p_tel in out varchar2)
IS
BEGIN
p_tel := substr(p_tel,1,3) || '-' || substr(p_tel,4);
END;
/

var_g_tel varchar2(10);

BEGIN
:g_tel :=1234567;
END
/

exec usp _ tel(:g_tel)
print : g_tel
---------------------------------------------------------------------
=====================================================================

*******트리거 TRIGGER (콜백 메서드)
발단 : 이벤트가 자동적으로 호출되서 사용

1. 이벤트에 의해 자동으로 호출되는 프로시저
-DML (insert, update, delete)
2. 문법
CREATE [OR REPLACE] TRIGGER 트리거명 {BEFORE|AFTER}
트리거 이벤트 ON 테이블명
[반복문]
BEGIN
END;
3. DD(data dictionary) : user_triggers

4. 트리거는 기본적으로 2개의 임시테이블을 가지고 있다.
OLD(:old), NEW(:new)
insert into member values(4, '권율', '수원', '444-4444');
delete from member where id=1;
update member set addr='제주' where id =20

insert 는 new 테이블 사용
delete 는 old 테이블 사용
update 는 old, new 두개의 테이블 다 사용

=====================================================================

*** 실습 

1. emp 테이블 에서 급여를 수정할 ‹š 현재의 값보다 적게 수정할 수 없고, 현재 값보다 10% 이상 높게 수정할 수 없도록 제한하는 트리거 작성

CREATE OR REPLACE TRIGGER tri_sal_update
BEFORE update ON emp
FOR EACH ROW 
WHEN(NEW.sal < OLD.sal or NEW.sal > OLD.sal*1.1)
BEGIN
raise_application_error(-20506,'수정된 값이 범위에 맞지 않음');
END;
/
-------

update emp set sal = 3000 where ename='KING';

drop trigger tri_sal_update;ed;;/


2. emp테이블을 사용할 수 있는 시간은 월요일부터 금요일까지 09시부터 18시까지만 사용할 수 있도록 하는 트리거 작성

create or replace trigger tri_resource
         before update OR insert OR delete on emp
begin
      if to_char(sysdate, 'dy') in('토', '일') or to_number(to_char(sysdate, 'HH24')) not between 9 and 10
      then
      raise_application_error(-20506, '사용시간이 아닙니다.');
      end IF;
END;
/

show recyclebin

insert into emp(empno, ename) values(1000, 'test100');

3. emp 테이블에서 insert, update, delete문장이 하루에 몇건이나 발생하는지 조사하려고 한다. 조사 내용은 emp_audit라는 테이블에 저장하도록 한다. 조사항목은 사용자 이름, 작업구분, 작업시간으로 처리한다.

create table emp_audit(
   e_id   number(5),
   e_name varchar2(5),
   e_gubun varchar2(30),
   e_date date,
   constraint pk_id primary key(e_id)
);

create or replace trigger tri_audit
         after insert or update or delete on emp
begin 
   if inserting then
            insert into emp_audit values(seq_empno.nextval, user, 'insert작업', sysdate);
   elsif updating then
            insert into emp_audit values(seq_empno.nextval, user, 'update작업', sysdate);
   elsif deleting then
            insert into emp_audit values(seq_empno.nextval, user, 'delete작업', sysdate);
   end if;
end;

insert into emp(empno, ename) values(1000, 'test1000');
insert into emp(empno, ename) values(1001, 'test1001');
insert into emp(empno, ename) values(1002, 'test1002');

delete from emp where empno between 1000 and 1002;

select * from emp_audit;

151009 - SQL 과제


해당 테이블 생성하기



계정 생성 후 접속
===========================================

CREATE USER pbs IDENTIFIED by 1111;
GRANT RESOURCE, connect to TEST;
CONN TEST/1111

테이블 post 만들기
===========================================

CREATE TABLE POST(
POST1 CHAR(3),
POST2 CHAR(3),
ADDR VARCHAR2(60)  CONSTRAINT POST_ADDR NOT NULL,
CONSTRAINT PK_POST PRIMARY KEY (POST1, POST2)
);


출력
=================================================


POS POS ADDR
--- --- ------------------------------------------------------------
        경기도 성남시 분당구 정자동


테이블 member 만들기
=================================================

CREATE TABLE MEMBER(
ID   NUMBER(4)   CONSTRAINT MEMBER_PK_ID PRIMARY KEY,
NAME  VARCHAR2(10)  CONSTRAINT MEMBER_NAME NOT NULL,
SEX   CHAR(1)    CONSTRAINT MEMBER_CK_SEX CHECK(sex=1 OR sex=2),
JUMIN1  CHAR(6),
JUMIN2  CHAR(7),
TEL   VARCHAR2(15),
POST1  CHAR(3),
POST2  CHAR(3),
ADDR  VARCHAR2(60),  
CONSTRAINT MEMBER_UK_JUMIN UNIQUE (JUMIN1, JUMIN2),
CONSTRAINT MEMBER_FK_POST FOREIGN KEY (POST1, POST2)REFERENCES POST(POST1, POST2)
);


데이터 입력하기
===================================================
ALTER TABLE POST DISABLE NOVALIDATE CONSTRAINT PK_POST; //POST 에 제약 일시정지

INSERT INTO POST VALUES('', '', '경기도 성남시 분당구 정자동'); //post 에 데이터 입력

ALTER TABLE POST ENABLE NOVALIDATE CONSTRAINT PK_POST; //POST 에 제약 재실행


ALTER TABLE MEMBER DISABLE NOVALIDATE CONSTRAINT MEMBER_FK_POST; //member 에 제약 일시정지

INSERT INTO MEMBER VALUES('1234', '홍길동', '1', '990101',  // member 에 데이터입력
       '1232344', '712-1234', '100', '010', '');

ALTER TABLE MEMBER ENABLE NOVALIDATE CONSTRAINT MEMBER_FK_POST; // member 에 제약 재실행


출력
====================================================

        ID NAME       S JUMIN1 JUMIN2  TEL             POS POS
---------- ---------- - ------ ------- --------------- --- ---
ADDR
------------------------------------------------------------
      1234 홍길동     1 990101 1232344 712-1234        100 010


====================================================