티스토리 뷰
2015/10/12 - [스프링] - 1) 스프링 프로젝터 생성하기
2015/10/12 - [스프링] - 2) 스프링 프로젝트 폴더 파일 구조 분석
2015/10/13 - [이클립스] - 3) 스프링 프로젝트 index.html defult.jsp 파일..? 톰캣 web.xml 설정
2015/10/13 - [CSS] - 4) uikit 적용하는 방법, log4j:ERROR Could not parse url 에러 문제
2015/10/15 - [스프링] - 5) 어노테이션 예제 컨트롤러 annotation @Controller
2015/10/15 - [스프링] - 6) 어노테이션 예제 서비스 annotation @Service
2015/10/15 - [스프링] - 7) 스프링 어노테이션 예제 리포지터리 annotation @Repository ,uikit scrollspy 사용법, c:forEach 사용
2015/10/19 - [스프링] - 8) 스프링 로그 출력
2015/10/19 - [스프링] - 9) 서블렛 추가
일단 프로그램 실행
참고로 버전에 따라 기능이 다를수 있다..
그땐 알아서 하자;;
난 7.3버전이다.
새파일을 만들자
난 오라클 유저기 때문에(?) 저리 설정했다
그리고 일반적으로 사용하는 표현형태로 설정해주자.
이건 왜그런지는 모르겠다..
옵션 설정이 끝났으면 테이블이랑 관계 설정(?)을 해보자
1번 아이콘으로 테이블 두개 만들고
각 테이블마다 위처럼 칼럼을 입력해주자
2번을 눌러서 3,4번 테이블을 순서대로 눌러주자.
반대 순서로 하면 상하 관계가 역전된다;;
5번 선을 더블 클릭해서 자세한 상하관계 옵션 설정을 해주자
설명을 하자면
한 유저는 하나도 없거나 하나 이상의 게시물을 가질수 있다
게시판 테이블의 칼럼들은 빈값(null)이 없어야 한다.
그결과 선 모양이 저렇게 된다
위에서 설정을 이리저리 바꿔가며 선이 어떻게 바뀌는지 보는것도 좋다.
이걸로 pk fk 설정은 끝났다.
참 쉽죠?
하지만....
아직 설정은 멀고도 멀었다.
아래 내용을 계속 따라하자
피지컬로 설정을 바꾸자
실제로 입력되는 정보로 보여준다.
이상태에서 칼럼명을 바꾸면 로지컬쪽의 별명은 그대로 남게 된다.
간략히 볼댄 로지컬
상세하게 볼땐 피지컬
현재 상세 설정을 안해서 둘다 똑같이 나온다
칼럼열의 기본값을 설정하는곳이다
그중 자주쓰는건 등록해둘려고 한다
특히 가입한 날자라던가 게시한 날자같은건 자동으로 입력되게 처리하는게 편하다.
지금 그걸 하는 중이다
별도로 쓸 이름을 지정
예의상 낫널을 해주자
여긴 기본값 설정하는곳
여러곳에서 쓸수 잇기때문에 로지컬은 한글로 써도된다
피지컬은 실제로 오라클 디비에 들어갈 명칭이기에 가급적 영어로..
실제로 입력될값인 시스데이트
이걸로 일단 공용 옵션은 설정했다.
이제 이걸 실제로 각 테이블마다 적용하자.
근데 지금은 겨우 두테이블이지만 나중에가면 수십테이블...
그것도 그 수십테이블에 똑같은 칼럼타입을 사용하면 위같이 설정해둬서 사용하는편이 좋다.
아무튼 회원 테이블 더블 클릭
아놔 못해먹겠다
아뒤,비번,닉네임 공용 설정 하나더 만들자
저렇게 하나만들고 아뒤비번 닉넴을 저걸로 설정해주자
그러면...
바뀐게 없어보인다;;
배경 아무데나 우클릭 해서 아래같이 설정하자
그러면 위같이 어떻게 설정됬는지 다 표시된다
어이쿠
게시판에 번호가 문자열로 들어가버렸다
그리고 제목과 내용도 스트링형이 아니다 변경하자
그리고 문자열 길이를 제목은 100자
내용은 4천자로 설정해주자
넘버형으로 바꿔주자
그러고보니 유니크를 안걸었다
아뒤랑 닉네임 각각 유니크를 걸어주자
아뒤랑 닉네임이 각각 중복되면 엄청난 일이 되기때문에..
닉네임은 그렇다 쳐도 아뒤는 무조건 중복을 막아야 한다.
해당 테이블의 칼럼중 아무거나 우클릭-인덱스
아참 위에서 캔슬이 아니라 클로즈 눌러야한다
캔슬 누르면 취소다...(설마..)
원래 인덱스 맴버 거는건 신중해야하는데...
뭐 일단 넘어가쟈...
하지만 나중엔 성능에 관해서 꼭 인덱스 관련 정보를 보기 바란다
인덱스 잘못하면 성능이 심각하게 차이난다
다음은 시퀸스인데...
이건 다음 토드에서 하자.
어쨋든 테이블 만든건 일단 하드 아무데나 저장......하진 말고
이전 프로젝트 폴더 안에 하나 문서 폴더 만들어서 같이 보관해라
이제 안전하게 저장했으니 이젠 해당 파일을 쿼리문으로 뽑아줄 차례다
그냥 멋들어 지라고 만든게 아니다
쓸려고 만든거다!
그전에 칼럼명을 영어로 바궈놓자;;
그리고 쿼리문으로 변환할 차례
원래 디비에 바로 접속해서 넣어주는 기능도 있는거 같지만
본인은 디비가 64버전이고 erwin은 32라 서로 호환이 안되서 불가..(대체 왜..)
아무튼 프리뷰를해서 복사하던가
레포트로 따로 저장하던가 좋을대루 하자
트리거는 테이블 내용 변화시 한쪽 테이블만 변경되는걸 막기 위해 있는거 같은데..
(예를들어 내 게시물은 그대로 있는데 유저 정보만 삭제된다던가..)
게시물은 냅두고 게시물이 삭제 된다던가 하게하고싶으면 트리거 삭제 해도된다.
난 일단 냅두겠다
CREATE TABLE tistory_board
(
b_no INTEGER NOT NULL ,
u_no INTEGER NOT NULL ,
u_title VARCHAR2(100) NOT NULL ,
u_text VARCHAR2(4000) NOT NULL ,
u_date DATE DEFAULT sysdate NOT NULL
);
CREATE UNIQUE INDEX XPK게시판 ON tistory_board
(b_no ASC);
ALTER TABLE tistory_board
ADD CONSTRAINT XPK게시판 PRIMARY KEY (b_no);
CREATE TABLE tistory_user
(
u_no INTEGER NOT NULL ,
u_id VARCHAR2(20) NOT NULL ,
u_pw VARCHAR2(20) NOT NULL ,
u_nick VARCHAR2(20) NOT NULL ,
u_date DATE DEFAULT sysdate NOT NULL
);
CREATE UNIQUE INDEX XPK회원테이블 ON tistory_user
(u_no ASC);
ALTER TABLE tistory_user
ADD CONSTRAINT XPK회원테이블 PRIMARY KEY (u_no);
CREATE UNIQUE INDEX XAK1회원테이블 ON tistory_user
(u_id ASC);
ALTER TABLE tistory_user
ADD CONSTRAINT XAK1회원테이블 UNIQUE (u_id);
CREATE UNIQUE INDEX XAK2회원테이블 ON tistory_user
(u_nick ASC);
ALTER TABLE tistory_user
ADD CONSTRAINT XAK2회원테이블 UNIQUE (u_nick);
ALTER TABLE tistory_board
ADD (CONSTRAINT R_2 FOREIGN KEY (u_no) REFERENCES tistory_user (u_no));
CREATE TRIGGER tI_tistory_board BEFORE INSERT ON tistory_board for each row
-- ERwin Builtin Trigger
-- INSERT trigger on tistory_board
DECLARE NUMROWS INTEGER;
BEGIN
/* ERwin Builtin Trigger */
/* tistory_user tistory_board on child insert restrict */
/* ERWIN_RELATION:CHECKSUM="0000edb0", PARENT_OWNER="", PARENT_TABLE="tistory_user"
CHILD_OWNER="", CHILD_TABLE="tistory_board"
P2C_VERB_PHRASE="", C2P_VERB_PHRASE="",
FK_CONSTRAINT="R_2", FK_COLUMNS="u_no" */
SELECT count(*) INTO NUMROWS
FROM tistory_user
WHERE
/* %JoinFKPK(:%New,tistory_user," = "," AND") */
:new.u_no = tistory_user.u_no;
IF (
/* %NotnullFK(:%New," IS NOT NULL AND") */
NUMROWS = 0
)
THEN
raise_application_error(
-20002,
'Cannot insert tistory_board because tistory_user does not exist.'
);
END IF;
-- ERwin Builtin Trigger
END;
/
CREATE TRIGGER tU_tistory_board AFTER UPDATE ON tistory_board for each row
-- ERwin Builtin Trigger
-- UPDATE trigger on tistory_board
DECLARE NUMROWS INTEGER;
BEGIN
/* ERwin Builtin Trigger */
/* tistory_user tistory_board on child update restrict */
/* ERWIN_RELATION:CHECKSUM="0000f174", PARENT_OWNER="", PARENT_TABLE="tistory_user"
CHILD_OWNER="", CHILD_TABLE="tistory_board"
P2C_VERB_PHRASE="", C2P_VERB_PHRASE="",
FK_CONSTRAINT="R_2", FK_COLUMNS="u_no" */
SELECT count(*) INTO NUMROWS
FROM tistory_user
WHERE
/* %JoinFKPK(:%New,tistory_user," = "," AND") */
:new.u_no = tistory_user.u_no;
IF (
/* %NotnullFK(:%New," IS NOT NULL AND") */
NUMROWS = 0
)
THEN
raise_application_error(
-20007,
'Cannot update tistory_board because tistory_user does not exist.'
);
END IF;
-- ERwin Builtin Trigger
END;
/
CREATE TRIGGER tD_tistory_user AFTER DELETE ON tistory_user for each row
-- ERwin Builtin Trigger
-- DELETE trigger on tistory_user
DECLARE NUMROWS INTEGER;
BEGIN
/* ERwin Builtin Trigger */
/* tistory_user tistory_board on parent delete restrict */
/* ERWIN_RELATION:CHECKSUM="0000da23", PARENT_OWNER="", PARENT_TABLE="tistory_user"
CHILD_OWNER="", CHILD_TABLE="tistory_board"
P2C_VERB_PHRASE="", C2P_VERB_PHRASE="",
FK_CONSTRAINT="R_2", FK_COLUMNS="u_no" */
SELECT count(*) INTO NUMROWS
FROM tistory_board
WHERE
/* %JoinFKPK(tistory_board,:%Old," = "," AND") */
tistory_board.u_no = :old.u_no;
IF (NUMROWS > 0)
THEN
raise_application_error(
-20001,
'Cannot delete tistory_user because tistory_board exists.'
);
END IF;
-- ERwin Builtin Trigger
END;
/
CREATE TRIGGER tU_tistory_user AFTER UPDATE ON tistory_user for each row
-- ERwin Builtin Trigger
-- UPDATE trigger on tistory_user
DECLARE NUMROWS INTEGER;
BEGIN
/* ERwin Builtin Trigger */
/* tistory_user tistory_board on parent update restrict */
/* ERWIN_RELATION:CHECKSUM="00010262", PARENT_OWNER="", PARENT_TABLE="tistory_user"
CHILD_OWNER="", CHILD_TABLE="tistory_board"
P2C_VERB_PHRASE="", C2P_VERB_PHRASE="",
FK_CONSTRAINT="R_2", FK_COLUMNS="u_no" */
IF
/* %JoinPKPK(:%Old,:%New," <> "," OR ") */
:old.u_no <> :new.u_no
THEN
SELECT count(*) INTO NUMROWS
FROM tistory_board
WHERE
/* %JoinFKPK(tistory_board,:%Old," = "," AND") */
tistory_board.u_no = :old.u_no;
IF (NUMROWS > 0)
THEN
raise_application_error(
-20005,
'Cannot update tistory_user because tistory_board exists.'
);
END IF;
END IF;
-- ERwin Builtin Trigger
END;
/
이걸로 테이블 생성 쿼리문 완성.
다음엔 토드로 유저 계정 생성하고 위 테이블을 넣어보자
'DB' 카테고리의 다른 글
11) 토드로 오라클 DB에 테이블 생성하기 (0) | 2015.10.19 |
---|