[간단한 DB모델링 연습]


1.학사관리 업무분석
- 우리 학교에서 학생들이 어떤과목을 수강을 하고
   어떤 과목을 교육을 하는지 데이터베이스로 시스템을 구축하려고 한다.

- 자바과정을 수강하는 학생들이 누구인지?
   자바세부교과목이 무엇이고, 학점이 얼마인지?

- 어떤과목이 개강하는지? 어떤 과목이 폐강인지?

위와 같은 업무분석을 한 내용을 토대로 테이블설계를 한다.
1.중요 단어들만 나열해보자
   : 학생, 과목, 수강, 학점
2.테이블설계 (주제)
   :학생테이블->번호,이름,주소,연락처,이메일 등등
   :과목테이블->과목명,학점

* 학생테이블에 과목코드가 입력이 되거나
   과목테이블에 학번이 입력이 되면 테이블 모양이 이상해 진다.

학생 ---------- 과목
  1            :           N
  N            :           1

결론) 학생테이블과 과목테이블은 다:다 (N:M) 관계가 성립된다.
        다:다 관계일경우 반드시 교차테이블이 있어야 한다.

* 학생테이블과 과목테이블의 관계를 정의한다.
  학생 ----  수강 -----  과목
     1              N                1

예)
회원 ------ 예매 ------ 영화
회원 ------ 구매 ------ 물품

사원 ------ 부서
  N                  1

* 테이블과의 관계는 대부분 일직선 형태를 이룬다.

drop table tb_student
drop table tb_gwamok
drop table tb_sugang

select * from tb_student
select * from tb_gwamok


[학생테이블]
create table tb_student
(
hakno  char(4)   primary key
,uname varchar(10) not null
,phone varchar(10) not null
)

[과목테이블]
create table tb_gwamok
(
gcode  char(4)   primary key
,gname varchar(20) not null
,hakjum tinyint    default  1
)

[수강테이블]
create table tb_sugang
(
sno   int   identity primary key
,hakno char(4)      foreign key references tb_student(hakno)
,gcode  char(4)     foreign key references tb_gwamok(gcode)
            on update cascade
            on delete cascade
,regdt  smalldatetime  default getdate()
)

 


insert tb_student values('5002','민들레','478-6932')
insert tb_student values ('5003','홍길동','223-4569')
insert tb_student values ('5004','라일락','354-7788')
insert tb_student values ('5005','무궁화','354-8520')
insert tb_student values ('5001','홍길동','444-8952')

insert tb_gwamok values('P001','데이터베이스',2)
insert tb_gwamok values('P002','JSP',5)
insert tb_gwamok values('D001','포토샵',3)
insert tb_gwamok values('D002','일러스트',3)
insert tb_gwamok values('C001','CAD',5)

insert tb_sugang values('5003','P001','2009-11-05')
insert tb_sugang values('5002','P001','2009-11-07')
insert tb_sugang values('5002','D001','2009-11-07')
insert tb_sugang values('5004','D001','2009-11-09')
insert tb_sugang values('5001','P002','2009-11-15')

select * from tb_student
select * from tb_sugang
select * from tb_gwamok

문)학번 5002의 이름과 수강과목은?
select tb_sugang.hakno,tb_student.uname,tb_gwamok.gname
from tb_sugang,tb_student,tb_gwamok
where tb_sugang.hakno=tb_student.hakno
and tb_sugang.gcode=tb_gwamok.gcode
and tb_sugang.hakno='5002'


select *
from tb_sugang join tb_student
on tb_sugang.hakno=tb_student.hakno join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode
where tb_sugang.hakno='5002'

select *
from tb_sugang
where hakno='5002'

use mydb

[테이블 조인]
-- MS-SQL방식
select T1.*,T2.*
from T1,T2
where T1.x=T2.x

select T1.*,T2.*,T3.*
from T1,T2,T3
where T1.x=T2.x
and T2.y=T3.y

-- ANSI 표준방식
select T1.*, T2.*
from T1 join T2
on T1.x=T2.x

select *
from T1 join T2
on T1.x=T2.x join T3
on T2.y=T3.y

 

문) 학번 5002가 수강한 과목명과 이름 조회하시오
select tb_sugang.hakno,tb_sugang.gcode,
   tb_gwamok.gname,tb_gwamok.hakjum,tb_student.uname
from tb_sugang join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode join tb_student
on tb_sugang.hakno=tb_student.hakno
where tb_sugang.hakno='5002'

 

문) 학번5002가 수강한 전체 학점의 합계는?
select AA.hakno,AA.uname,sum(AA.hakjum) as [전체학점]
from (
    select tb_sugang.hakno,tb_sugang.gcode,
       tb_gwamok.gname,tb_gwamok.hakjum,tb_student.uname
    from tb_sugang join tb_gwamok
    on tb_sugang.gcode=tb_gwamok.gcode join tb_student
    on tb_sugang.hakno=tb_student.hakno
    where tb_sugang.hakno='5002'
   ) as AA
group by AA.hakno,AA.uname

 

문1)수강날짜 '2009-11-07' 입력하면 수강한 학번,학생이름,과목명 조회
select tb_student.hakno,tb_student.uname,tb_gwamok.gname,regdt
from tb_sugang join tb_student
on tb_sugang.hakno=tb_student.hakno join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode
where convert(char(10),tb_sugang.regdt,120)='2009-11-07'

 

문2)과목코드 'P001'를 입력하면 수강한 학생의 학번,이름 조회

select tb_sugang.gcode,tb_gwamok.gname,
    tb_student.hakno,tb_student.uname
from tb_sugang join tb_student
on tb_sugang.hakno=tb_student.hakno join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode
where tb_sugang.gcode='P001'


문3)과목당 수강한 인원이 각각 몇명인지 조회
select tb_sugang.gcode,tb_gwamok.gname,count(tb_sugang.gcode)
from tb_sugang join tb_gwamok
on tb_sugang.gcode=tb_gwamok.gcode
group by tb_sugang.gcode, tb_gwamok.gname


문4)과목당 수강인원이 2명이상인 과목명,과목코드,인원수 조회
select AA.gcode,AA.gname,count(AA.gcode)
from (
    select tb_sugang.gcode,tb_gwamok.gname
    from tb_sugang join tb_student
    on tb_sugang.hakno=tb_student.hakno join tb_gwamok
    on tb_sugang.gcode=tb_gwamok.gcode
   ) as AA
group by AA.gcode,AA.gname
having count(AA.gcode)>=2


문5)수강신청한 인원이 제일 적은 과목명과 학생의 학번,이름 조회
select *
from tb_student
where hakno in (select hakno
        from tb_sugang
        where gcode=(select top 1 gcode
               from tb_sugang
               group by gcode
               order by count(gcode)
               )
        )
문6)수강신청을 하지 않은 과목은?
select *
from tb_gwamok
where gcode not in (select gcode from tb_sugang)

 

[관계형 데이터베이스]
개념:데이터베이스내의 테이블은 최소한의 의미(주제)를 가지는
테이블로 분리해서 구성하되,
그 테이블에 있는 컬럼을 연결한 것이다.
     부모테이블:Primary Key 기본키
     자식테이블:Foreign Key 외래키
형태로 연결된다.

* 분리된 테이블은 관계가 형성되는데 총3가지 유형이 있다.
1. 1:1 관계
 두테이블간 어떤 테이블의 PK라도
 다른 테이블에 전이되어도 상관없다

2. 1:N 관계
 두 테이블간의 관계를 위해서 교차테이블 만들 필요 없다.
 단, 1관계에 있는 PK를 N관계에 있는 테이블에 컬럼으로
 전이시켜 관계를 맺는다.
   예)부서 ---- 사원

3. N:M 관계
 두 테이블간의 관계를 위해서 교차테이블을 반드시 만든다
   예)학생-수강-과목
   회원-예매-영화
   회원-구매-물품

* Foreign Key로 두 테이블간의 데이터 무결성(결점이 없는)을
  강제할수 있으며, JOIN작업으로 원하는 작업을 처리한다.

[참조무결성(FK제약조건)]
컬럼에 적용되는 3가지 제약조건
not null
no change->함부로 변하면 안됨
no duplicate

    부모테이블         자식테이블
입력   상관없음         반드시 부모테이블에 있는
                데이터가 입력된다.

수정 수정하려는 데이터가    부모테이블에 존재하는
   자식테이블에서 참조하고  다른데이터로 변경 가능
   있는지 검증

삭제 삭제하려는 데이터가    제약없다.
   자식테이블에서 참조하고
   있는지 검증

'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글

뷰 VIEW  (0) 2009.11.27
[MS-SQL] 최종 실습 예제  (0) 2009.11.27
우편번호 쿼리  (0) 2008.12.19
18_회원  (0) 2008.06.18
17_공지사항  (0) 2008.06.18

use mydb

 

[제어문]
1.조건문
  -if문, case문
2.반복문
  -while문


declare @su int
set @su=5
if @su<0
 select '음수'
else
 select '양수'

declare @su int
set @su=0
if @su<0
 select '음수'
else if @su>0
 select '양수'
else
 select '제로'

declare @su int
set @su=0
select
 case @su
  when 0 then '제로'
  when 1 then '하나'
  when 2 then '두울'
  else      '나머지'
 end

declare @su int,@hap int
set @su=1
set @hap=0
while @su<=10
 begin
  set @hap=@hap+@su
  set @su=@su+1
 end
select @hap
--begin~end   { }동일

 

 

[뷰 VIEW]
- 저장프로시저 목적과 비슷
- 복잡한 쿼리문장을 매번 실행 할때마다 타이핑해야 한다면
 매우 귀찮을수 있다. 이런 것들을 뷰로 만들어 수월하게 질의할수 있고,
 네트웍 트래픽도 줄일수 있다.
- 테이블 전체를 보여 주어서는 안되는 경우, 보여줄 칼럼들만 가져오는
 뷰를 만들어서 사용한다.
- 뷰를 사용하는 목적
 1.사용의 편의성 2. 보안의 이유

- 뷰의 정의
 이미 존재하는 하나 혹은 그 이상의 테이블에서 원하는 데이터만
 정확히 가져올수 있도록 미리 원하는 칼럼만 모아 가상적으로
 만든 테이블이다.
 뷰는 진짜로 존재하는 테이블이 아니라 가상적으로 존재하는 테이블
 가상테이블이라 할수 있다.

형식)
 create view 뷰이름
 as
  쿼리문작성

use mydb
select * from w_zipcode

create view vtest1
as
 select zipcode as [우편번호],sido as [시도],
    gugun as [구군], dong as [동], ri as [리], bunji as [번지]
 from w_zipcode


select * from w_zipcode
select * from vtest1 where 시도='서울'

문)전국의 시도별 각각의 시 or 구 or 군가 몇개씩 존재하는지
    오름차순으로 출력하시오.
   w_zipcode테이블에서 검색

create view vtest3
as
 select AA.sido as [시도],count(AA.sido) as [cnt]
 from (
    select sido,gugun
    from w_zipcode
    group by sido,gugun
      ) as AA
 group by AA.sido

select * from vtest3

문)갯수가 20이상만 조회
select *
from vtest2
where 갯수>=20


문)서울, 경기,제주 만 조회
select *
from vtest2
where 시도 in ('서울','경기','제주')

문)위의 내용에서 시도이름을 영문으로 출력하시오

select
 case 시도
  when '서울' then 'seoul'
  when '경기' then 'kyoungki'
  when '제주' then 'jeju'
 end
 ,갯수
from vtest2
where 시도 in ('서울','경기','제주')

문)시도,갯수를 출력하되,
  갯수가 30이상 '매우많음', 20이상 '많음', 10이상 '보통', 나머지 '적음'

select 시도,갯수,
       case
        when 갯수>=30 then '매우많음'
        when 갯수>=20 then '많음'
        when 갯수>=10 then '보통'
        else '적음'
       end
from vtest2

------에러-------------------

if(select 갯수 from vtest2)>=30
 select '매우많음'
else if(select 갯수 from vtest2)>=20
 select '많음'
else if(select 갯수 from vtest2)>=10
 select '보통'
from vtest2 
-----에러--------------------


select * from tb_student

sp_helptext vtest2  --사용자가 만든 뷰,인덱스등의 내용을 보여줌.

create view vtest4
as
 select * from tb_student


select * from vtest4   --학생테이블 뷰
select * from tb_student  --원본

update vtest4
set uname='당산동'
where hakno='5001'

delete from vtest4 where hakno='5001'

- 뷰에서 수정,삭제할경우 원본도 적용될수 있으니 주의
- 뷰를 통해서 수정,삭제도 가능하지만
 되도록이면 select구문만 뷰를 만들어서 사용할것


 

'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글

간단한 DB모델링 연습  (0) 2009.11.27
[MS-SQL] 최종 실습 예제  (0) 2009.11.27
우편번호 쿼리  (0) 2008.12.19
18_회원  (0) 2008.06.18
17_공지사항  (0) 2008.06.18

[MS-SQL 최종 실습 예제]

 

1. 회원테이블+방명록테이블 생성하시오

 

2. hyundai.mdb파일의 w_zipcode 테이블 가져오기

 

3. w_zipcode테이블에 dong 칼럼에 인덱스 추가

 

4. 회원테이블의 회원가입 저장프로시저 생성

 

5. 방명록테이블의 게시판 검색 저장 프로시저 생성

 

6. 회원 로그인 저장프로시저 생성

 

7. 백업파일 생성 프로시저 생성

 

'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글

간단한 DB모델링 연습  (0) 2009.11.27
뷰 VIEW  (0) 2009.11.27
우편번호 쿼리  (0) 2008.12.19
18_회원  (0) 2008.06.18
17_공지사항  (0) 2008.06.18

select  * from w_zipcode
문1)동이름 '당산'으로 시작하는 레코드 출력하시오
select *
from w_zipcode
where dong like '당산%' -- left(dong,2)='당산'

문2)동이름 '사서함'으로 끝나는 레코드 출력하시오
select *
from w_zipcode
where dong like '%사서함' --right(dong,3)='사서함'

문3)우편번호가 '100'으로 시작하고,
      동이름에 '중앙'이 들어가는 레코드 출력하시오
select *
from w_zipcode
where zipcode like '100%'
and dong like '%중앙%'

문4)리에 데이터가 있는 레코드를 출력하시오
select *
from w_zipcode
where ri is not null

문5)번지에 데이터가 입력되지 않은 레코드를 출력하시오
select *
from w_zipcode
where bunji is null

문6)서울시의 레코드를 출력하시오.
select *
from w_zipcode
where sido='서울'

문7)서울시중에서 영등포구,강남구,마포구만 출력하시오
select *
from w_zipcode
where gugun in ('영등포구','강남구','마포구')
--gugun='영등포구' or gugun='강남구' or gugun='마포구'

문8)서울시의 각각의 구 중에서 동갯수가 많은 상위 5개의
      구이름,동갯수를 출력하시오
select AA.gugun,count(*)
from(
  select gugun,dong,count(dong) as [동갯수]
  from w_zipcode
  where sido='서울'
  group by gugun,dong
)
as AA
group by AA.gugun
======================
select top 5 AA.gugun,count(*)
from (
   select gugun,dong,count(dong) as [동갯수]
   from w_zipcode
   where sido='서울'
   group by gugun,dong
  )
as AA
group by AA.gugun
order by count(*) desc

테이블은 물리적테이블과 논리적테이블 나눈다.


문9)각 시도별 시or군중에서 동or읍 갯수가 50이상인 레코드의 도이름,
      시이름, 동갯수를 출력하시오
select AA.sido,AA.gugun,count(AA.gugun)
from (
   select sido,gugun,dong
   from w_zipcode
   group by sido,gugun,dong
       ) as AA --논리적테이블
group by AA.sido,AA.gugun
having count(AA.gugun)>=50
order by count(AA.gugun) desc


문10)전국의 시도별 각각의 시or군or면 이 몇개씩 존재하는지
      오름차순으로 출력하시오.
select AA.sido,count(AA.sido)
from (
   select sido,gugun
   from w_zipcode
   group by sido,gugun
       ) as AA --논리적테이블
group by AA.sido
order by count(AA.sido)

'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글

뷰 VIEW  (0) 2009.11.27
[MS-SQL] 최종 실습 예제  (0) 2009.11.27
18_회원  (0) 2008.06.18
17_공지사항  (0) 2008.06.18
16_방명록  (0) 2008.06.18

CREATE TABLE MEMBER3(
IDX INT IDENTITY
,NO INT         --번호
,ID VARCHAR(20)    --아이디
,NAME VARCHAR(20)  --이름
,PHONE VARCHAR(20)  --연락처
)
SELECT * FROM MEMBER3 order by idx desc
use mydb

select * from tb_guest

insert into tb_guest(subject) values('행복하세요')

create table tb_member
(
 member_idx int      identity,
 uid      varchar(20) primary key,
 upw     varchar(10) not null,
 uname    varchar(20) not null,
 jumin1    char(6)    not null,
 jumin2    char(7)    not null,
 uzip     char(7)    not null,
 uaddr     varchar(255),
 uphone    varchar(20),
 uemail    varchar(50),
 regdt     datetime   default getdate()
)

 

*회원들이 새로운 클럽을 만들면 생성되는 SP
스키동호회

declare @BoardName varchar(50)
declare @sql varchar(255)
set @BoardName='스키동호회'
set @sql='create table '+@BoardName
set @sql=@sql+'(bnum int,bname varchar(10))'
exec (@sql)


alter proc CreateCafe
 @BoardName varchar(50)
as
 declare @sql varchar(255)
 set @sql='create table '+@BoardName
 set @sql=@sql+'(bnum int,bname varchar(10))'
 exec (@sql)

CreateCafe '래프팅동호회'

select * from 래프팅동호회

 


select * from 스키동호회

 


*게시판 이름을 입력하면 새로운 게시판이
  만들어지는 저장 프로시저

 

create proc Make_myboard
 @BoardName varchar(50)
as
 declare @sql varchar(255)
 set @sql='create table '+@BoardName
 set @sql=@sql+'(bno int identity primary key,'
 set @sql=@sql+'subject varchar(255) not null,'
 set @sql=@sql+'contents text not null,'
 set @sql=@sql+'readcnt int default 0,'
 set @sql=@sql+'regnm varchar(20) not null,'
 set @sql=@sql+'regdt datetime default getdate())'
   exec (@sql) 

Make_myboard  '수다들의모임'
select * from 수다들의모임
[회원인증 프로시저]
존재의 유무
(커버드쿼리라 함:조회의 대상과 결과의 대상이 같은것)
select * from tb_member
alter proc sp_MemberLogin
 @id varchar(20),@pw varchar(20)
as
 if exists(select uid from tb_member where uid=@id and upw=@pw)
  select 'O' as [res]
   else
  select 'X' as [res]


sp_MemberLogin 'lee', '1234'

 

 

 

 

 


 

 

'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글

[MS-SQL] 최종 실습 예제  (0) 2009.11.27
우편번호 쿼리  (0) 2008.12.19
17_공지사항  (0) 2008.06.18
16_방명록  (0) 2008.06.18
15_서브쿼리  (0) 2008.06.18

--공지사항 테이블 설계
create table tb_notice
(
 noticeidx int identity  primary key,
 nsubject  varchar(255)  not null,
 ncontents text      not null,
 regdt   smalldatetime default getdate()
)

--공지사항추가 프로시저 작성
create proc Ins_notice
@subject varchar(255),@contents text
as
 insert into tb_notice(nsubject,ncontents)
   values(@subject,@contents)


select * from tb_notice

 

'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글

우편번호 쿼리  (0) 2008.12.19
18_회원  (0) 2008.06.18
16_방명록  (0) 2008.06.18
15_서브쿼리  (0) 2008.06.18
14_트리거  (0) 2008.06.18
--방명록 테이블 설계
create table tb_guest
(
  guest_idx int      identity primary key,
  subject  varchar(255)  not null,
  regdt   datetime   default getdate()
)
insert tb_guest(subject) values('무궁화꽃이 피었습니다.')
select * from tb_guest

'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글

18_회원  (0) 2008.06.18
17_공지사항  (0) 2008.06.18
15_서브쿼리  (0) 2008.06.18
14_트리거  (0) 2008.06.18
13_백업  (0) 2008.06.18

create table tb_sawon(
sabun  varchar(10) primary key,  --사원번호
saname varchar(20),       --사원이름
sajik  varchar(20),       --직위
saboss varchar(10),       --관리자
sadate smalldatetime default getdate(),--입사일
sapay  int,           --연봉
sapart  tinyint          --부서
)
insert tb_sawon values('1001','노무현','회장',null,'2000-2-2',50000,10)
insert tb_sawon values('1002','이명박','사장','1001','2001-2-2',40000,10)
insert tb_sawon values('1003','정동영','사장','1001','2001-3-2',40000,10)
insert tb_sawon values('1004','박근혜','전무','1002','2002-3-2',40000,20)
insert tb_sawon values('1005','홍길동','부장','1004','2005-2-2',30000,20)
insert tb_sawon values('1006','손학규','전무','1003','2003-1-2',25000,10)
insert tb_sawon values('1007','봉선화','부장','1006','2004-2-2',30000,30)
insert tb_sawon values('1008','진달래','대리','1005','2002-5-2',25000,30)
insert tb_sawon values('1009','백장미','대리','1005','2002-4-2',10000,10)
insert tb_sawon values('1010','민들레','대리','1007','2002-7-2',10000,10)

문1)사원번호1007번보다 급여가 많은 모든 사원들의 이름출력
select saname
from tb_sawon
where sapay>(select sapay from tb_sawon where sabun='1007')


문2)사원번호1002번과 같은 직책의 모든 사원들의 이름,직책출력
select saname,sajik
from tb_sawon
where sajik=(select sajik from tb_sawon where sabun='1002')

문3)직책이 1005번과 같고 급여가 1004번 사원보다 많은 사원의
      이름과 직책 출력
select saname,sajik from tb_sawon
where sajik=(select sajik from tb_sawon where sabun='1005')
and sapay>(select sapay from tb_sawon where sapay='1004')


문4)모든 사원중 최소급여를 받는 사원의 이름과 급여 출력
select saname,sapay from tb_sawon
where sapay=(select min(sapay) from tb_sawon)

문5)사번1009번과 같은 부서의 이름과 부서 출력
select saname,sapart from tb_sawon
where sapart=(select sapart from tb_sawon where sabun='1009')

문6)각부서의 번호와 부서별 최소급여
select sapart,min(sapay) from tb_sawon group by sapart

문7)각부서별로 몇명의 사원이 있는지?
select sapart,count(*) from tb_sawon group by sapart


문8)각부서에서 최소급여를 받는 사원들의 급여,부서번호출력
select AA.sapart,min(AA.sapay)
from (
  select saname,sapay,sapart from tb_sawon
  where sapay in
      (select min(sapay) from tb_sawon group by sapart)

) as AA
group by AA.sapart


문9)부서번호20의 최소급여보다 최소급여가 큰 부서의 부서번호
select sapart,min(sapay)
from tb_sawon
group by sapart
having min(sapay)>
    (select min(sapay) from tb_sawon where sapart='20')

 

 

 

 


[조인]
-inner join 내부조인. 기본. 생략가능 90%
-self join(재귀적관계) 자기자신을 조인 5%
-outer join : left join,right join, full join 5%
-cross join 잘사용안함.

[ANSI문]
select * from 고객 inner join 구매
on 고객.아이디=구매.아이디

select * from 고객 left outer join 구매
on 고객.아이디=구매.아이디

select * from 고객 right outer join 구매
on 고객.아이디=구매.아이디

select * from 고객 full outer join 구매
on 고객.아이디=구매.아이디 --완전하게 다 보여줌

[MS-SQL문법]
select * from 고객,구매 where 고객.아이디=구매.아이디

select * from 고객,구매 where 고객.아이디*=구매.아이디

select * from 고객,구매 where 고객.아이디=*구매.아이디

select * from 고객,구매 where 고객.아이디*=*구매.아이디
--에러

 

 

 

 

 

 

 


 

'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글

17_공지사항  (0) 2008.06.18
16_방명록  (0) 2008.06.18
14_트리거  (0) 2008.06.18
13_백업  (0) 2008.06.18
12_인덱스  (0) 2008.06.18

[트리거] trigger
자동화와 연결
trigger의미는 연쇄반응, 목적은 무결성의 원칙을 유지

형식)
create trigger 트리거이름
on 테이블명 for [insert/delete/update]
as 트리거 수행내용(sql문장)

-insert,delete,update에 대한 트리거만 생성할수 있다.
-한테이블에 데이터가 입력,수정,삭제 동작을 하면
  그것에 대한 영향이 다른 테이블에 미치게 한다.
-업무자동화(업무적인 룰을 DB단계에서 구현)
-다른테이블을 컨트롤
-논리적으로 일관성을 유지할 수 있음
-select에는 이벤트를 발생시키지 않음

ex)회원이 상품을 구매하면 상품재고가 줄어들고 구매는 늘어남.

ex)업체---입고---상품---구매--회원(마일리지)

use mydb
트랜잭션과 관련된 inserted/deleted테이블이 중간에 존재

begin tran
insert T1(unum,uname) values (1,'홍길동')
insert T1(unum,uname) values (2,'봉선화')

begin tran
delete from T1 where unum=1

begin tran
update T1
set uname='민들레'
where unum=2

rollback
commit

create table T1(
 unum  int identity primary key,
 uname varchar(20)
)
create table T2(
 unum  int identity primary key,
 uname varchar(20)
)

insert T1(uname) values('백장미')
select * from T1
select * from T2

insert T1(uname) values('민들레')
create trigger T1_insert
on  T1 for insert --이벤트
as
 declare @nm varchar(20)
 set @nm=(select uname from inserted)
 insert T2(uname) values (@nm)

문)T1 '민들레' 삭제하면 T2도 삭제되는 트리거 작성하시오
create trigger T1_del
on T1 for delete
as
 declare @nm varchar(20)
 set @nm=(select uname from deleted)
 delete from T2 where uname=@nm


delete from T1 where uname='민들레'
select * from t1
select * from t2


문)T1 '백장미'가 수정되면 T2이름도 수정되는 트리거 작성하시오
create trigger T1_update
on T1 for update
as
 declare @nm1 varchar(20),@nm2 varchar(20)
 set @nm1=(select uname from inserted)
 set @nm2=(select uname from deleted)
 update T2 set uname=@nm1 where uname=@nm2

update T1 set uname='흑장미' where uname='백장미'

실전예제)
create table 상품(
상품코드 char(4)   primary key,
상품명  varchar(30) not null,
상품가격 int     check(상품가격>=0),
재고수량 int      check(재고수량>=0) default 0
)
insert 상품 values('AAA','냉장고',1000,5)
insert 상품 values('BBB','에어콘',5000,3)
insert 상품 values('CCC','선풍기',3000,1)
select * from 상품

create table 입고(
입고번호 int identity primary key,
상품코드 char(4)   foreign key references 상품(상품코드),
입고일자 smalldatetime default getdate(),
입고수량 int     check(입고수량>=0),
입고단가 int     check(입고단가>=0),
입고금액 as  (입고수량*입고단가)
)


create trigger 입고_insert
on 입고 for insert
as
 declare @qty int, @cd char(4)
 set @qty=(select 입고수량 from inserted) 
 set @cd=(select 상품코드 from inserted)
 update 상품 set 재고수량=재고수량+@qty
 where 상품코드=@cd

insert 입고(상품코드,입고수량,입고단가) values ('AAA',8,500)

select * from 상품
select * from 입고

drop table 상품
drop table 입고


delete from 입고 where 입고번호=1

create trigger 입고_del --트리거작성하시오
on 입고 for delete
as
 declare @qty int,@cd varchar(4)
 set @qty=(select 입고수량 from deleted)
 set @cd=(select 상품코드 from deleted)
 update 상품 set 재고수량=재고수량-@qty
 where 상품코드=@cd

 

'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글

16_방명록  (0) 2008.06.18
15_서브쿼리  (0) 2008.06.18
13_백업  (0) 2008.06.18
12_인덱스  (0) 2008.06.18
11_동적프로시저  (0) 2008.06.18

[DB백업]
아주중요.......

1.명령어를 통한 방법(강추)
backup database mydb
to disk='c:\mydb20080616.bak'
with init --백업

restore database mydb
from disk='c:\mydb20080616.bak' --복구
문)백업을 매일 자동화 하고자 한다.
    동적SQL문을 활용하여 저장프로시저를 작성하시오
create proc sp_backup
as
 declare @sql varchar(50)
 set @sql='c:\mydb'+convert(char(10),getdate(),102)
 set @sql=@sql+'.bak'
 backup database mydb to disk=@sql with init

sp_backup
 

use master

drop database mydb

2.파일복사

~.mdf 데이터파일
~.ldf 트랜잭션 로그파일 저장
백업하려면 파일복사하면 되지만
매일 사람이 해야 하기 때문에
스크립트로 구현하는 편이 좋음

'..열심히 공부하세.. > MS-SQL' 카테고리의 다른 글

15_서브쿼리  (0) 2008.06.18
14_트리거  (0) 2008.06.18
12_인덱스  (0) 2008.06.18
11_동적프로시저  (0) 2008.06.18
10_매개변수 프로시저  (0) 2008.06.18

+ Recent posts