chua bai tap-on tap

15
1 --Câu1: --Viết thủ tục lưu trữ có tên sp_DTB với mô tả như sau: -- Tham số đầu vào: MaSV -- Tham số đầu ra: Điểm trung bình chung của sinh viên có MaSV trên. --Yêu cầu: kiểm tra MaSV có tồn tại trong bảng KetQua, nếu vi phạm thì đưa ra --thông báo lỗi. create proc sp_dtb (@ma char(6)) as begin declare @masv char(6),@diemtb float if exists ( select masv from KetQua ) begin select @masv=masv, @diemtb=round(AVG(diem),1) from KetQua group by masv having masv=@ma print @ma +N' có điểm trung binh la:'+ cast(@diemtb as char(6)) end else raiserror( 'ma sinh vien khong ton tai',16,1) end go -- thuc thi thu tuc exec sp_dtb 'sv0001' exec --Câu 2: -- Tạo trigger cho hành động chèn dữ liệu vào bảng Khoa và MonHoc, -- kiểm tra các ràng buộc toàn vẹn sau: -- Số CBGD của mỗi khoa phải lớn hơn 10 người -- Mã môn học (6 kí tự) phải tuân theo qui tắc sau: 2 ký tự đầu là ‘MH”, -- 4 ký tự sau biểu thị số kí tự. Ví dụ: MH0001 --Nếu không thỏa mãn ràng buộc trên thì hủy hành động chèn. --trigger 1 create trigger KTSlgv_khoa on khoa for insert as begin declare @socbgd int

Upload: hieple

Post on 22-May-2017

252 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: chua bai tap-on tap

1

--Câu1:

--Viết thủ tục lưu trữ có tên sp_DTB với mô tả như sau:

-- Tham số đầu vào: MaSV

-- Tham số đầu ra: Điểm trung bình chung của sinh viên có MaSV trên.

--Yêu cầu: kiểm tra MaSV có tồn tại trong bảng KetQua, nếu vi phạm thì đưa ra

--thông báo lỗi.

create proc sp_dtb (@ma char(6))

as

begin

declare @masv char(6),@diemtb float

if exists ( select masv from KetQua )

begin

select @masv=masv, @diemtb=round(AVG(diem),1)

from KetQua

group by masv

having masv=@ma

print @ma +N' có điểm trung binh la:'+ cast(@diemtb as char(6))

end

else

raiserror( 'ma sinh vien khong ton tai',16,1)

end

go

-- thuc thi thu tuc

exec sp_dtb 'sv0001'

exec

--Câu 2:

-- Tạo trigger cho hành động chèn dữ liệu vào bảng Khoa và MonHoc,

-- kiểm tra các ràng buộc toàn vẹn sau:

-- Số CBGD của mỗi khoa phải lớn hơn 10 người

-- Mã môn học (6 kí tự) phải tuân theo qui tắc sau: 2 ký tự đầu là ‘MH”,

-- 4 ký tự sau biểu thị số kí tự. Ví dụ: MH0001

--Nếu không thỏa mãn ràng buộc trên thì hủy hành động chèn.

--trigger 1

create trigger KTSlgv_khoa

on khoa

for insert

as

begin

declare @socbgd int

Page 2: chua bai tap-on tap

2

select @socbgd =socbgd from inserted

if (@socbgd<10)

begin

print 'so luong gv cua khoa phai >10'

rollback tran

end

else

print 'chen thanh cong'

end

---kích hoạt trigger

insert into khoa

values ('dl', N'động lực', 9)

insert into khoa

values ('dl', N'động lực', 19)

--trigger 2

create trigger kt_mamh

on monhoc

for insert

as

begin

declare @2kt char(2),@s1 char(1),@s2 char(1), @s3 char(1), @s4 char(1)

select @2kt=left(mamh,2) from inserted

select @s1=substring(mamh,3,1) from inserted

select @s2=substring(mamh,4,1) from inserted

select @s3=substring(mamh,5,1) from inserted

select @s4=substring(mamh,6,1) from inserted

if (@2kt='MH' and @s1 in (0,1,2,3,4,5,6,7,8,9)

and @s2 in (0,1,2,3,4,5,6,7,8,9)

and @s3 in (0,1,2,3,4,5,6,7,8,9)

and @s4 in (0,1,2,3,4,5,6,7,8,9))

print 'chen hop le, ma mon hoc thoa man'

else

begin

print 'khong thanh cong'

rollback tran

end

end

---

insert into monhoc

values('mh0007', N'triết học', 30,10)

insert into monhoc

values('mh009u', N'triết học', 30,10)

insert into monhoc

values('mt0090', N'triết học', 30,10)

DẠNG BÀI THI

Page 3: chua bai tap-on tap

3

Cho CSDL QLBH gồm các bảng sau:

LoaiSanPham (MaLoaiSP: nvarchar(10), TenLoaiSP : nvarchar(15), MoTa : nvarchar (16))

SanPham (MaSP: nvarchar(10), TenSP: nvarchar(40), HinhSP nvarchar(50), MaNhaCC:

nvarchar(10), MaLoaiSP: nvarchar(10), DVT nvarchar(20), DonGia: smallint, SoLuong:

smallint, SoLuongTT: smallInt, Discontinued: bit)

NhaCungCap (MaNhaCC: nvarchar(10), TenNhaCC: nvarchar(40), DiaChi: nvarchar(60),

Phone: nvarchar(24), Fax: nvarchar(24), Hompage: nvarchar (16))

Câu 1:Viết các câu lệnh T-SQL thực hiện các yêu cầu sau:

a) Hiển thị danh sách các sản phẩm với đầy đủ các thông tin sau: Loại sản phẩm, mã sản

phẩm, tên sản phẩm sắp xếp giảm dần theo tên sản phẩm

SELECT l.*, s.masp, s.tensp

From loaisanpham l, sanpham s

Where l.maloaisp=s.maloaisp

Order by s.tensp desc

b) Liệt kê các loại sản phẩm và số sản phẩm thuộc loại sản phẩm đó

SELECT l.maloaisp, l.tenloaisp, count(s.masp) as slsp

From loaisanpham l, sanpham s

Where l.maloaisp=s.maloaisp

Group by l.maloaisp, l.tenloaisp

c) Liệt kê các sản phẩm trong kho mà số lượng đã ở mức tối thiểu. Các thông tin gồm: Mã

loại sản phẩm, tên sản phẩm, mã sản phẩm, số lượng trong kho và số lượng ở mức tối

thiểu

Select maloaisp, masp, tensp, soluong, soluongtt

From sanpham

Where soluong=soluongtt

d) Liệt kê các sản phẩm và số lượng các sản phẩm thuộc loại sản phẩm này đã ở mức tối

thiểu

Select masp, tensp, soluong

From sanpham

Where soluong=soluongtt

e) Liệt kê những nhà cung cấp và số sản phẩm do họ cung cấp

Select c.manhacc, c.tennhacc, sum(s.soluong) as slsp

From nhacungcap c, sanpham s

Where c.mamhacc=s.manhacc

Group by c.manhacc, c.tennhacc

f) Liệt kê các loại sản phẩm có tối đa 10 sản phẩm

SELECT l.maloaisp, l.tenloaisp, count(s.masp) as slsp

From loaisanpham l, sanpham s

Where l.maloaisp=s.maloaisp

Group by l.maloaisp, l.tenloaisp

Having count(s.masp) =10

Page 4: chua bai tap-on tap

4

Câu 2:Thủ tục lưu trữ - Store Procedure

Viết thủ tục lưu trữ có tên sp_SoLuongSP được mô tả như sau:

- Tham số vào: MaNhaCC.

- Tham số ra: số lượng tất cả sản phẩm ứng với mã nhà cung cấp đó.

Yêu cầu: Kiểm tra MaNhaCC có tồn tại trong bảng SanPham, nếu vi phạm thì thông

báo lỗi.

Create proc sp_SoLuongSP (@manhacc nvarchar(10))

as

Begin

Declare @macc nvarchar(10)

Declare @sl int

If exists (select manhacc from sanpham, nhacungcap where

nhacungcap.manhacc=sanpham.manhacc)

begin

Select Manhacc, @sl=sum(soluong)

From sanpham

Where manhacc=@manhacc

Group by Manhacc

Print ‘nha cc’+ ‘ ’+ @manhacc+ ‘ co tong sl sp la ’ + cast (@sl as varchar(3))

End

Else

begin

Print ‘Ma nha cc nay khong ton tai’

return

end

end

Câu 3 Trigger

Viết trigger cho hành động chèn dữ liệu trên bảng SanPham. Biết rằng: chỉ được phép

chèn thông tin sản phẩm khi đã tồn tại MaNhaCC và MaLoaiSP cung cấp hàng. Nếu

không thỏa mãn điều kiện trên thì hủy hành động chèn.

create trigger kt_maCC_maLoaiSP

on sanpham

for insert

as

begin

if exists (select inserted.maloaisp from inserted, loaisanpham

where loaisanpham.maloaisp=inserted.maloaisp)

if exists (select inserted.manhacc from inserted, nhacungcap

Page 5: chua bai tap-on tap

5

where nhacungcap.manhacc=inserted.manhacc)

print 'chen hop le, ma mon hoc thoa man'

else

begin

print 'khong thanh cong'

rollback tran

end

end

Các ví dụ trên lớp

use QLSV

select * from kq

select * from lop

select * from sv

select * from mh

--vd1: hien thi thong tin cua cac sv ho nguyen

select * from sv

where ht like 'nguyen %'

--vd2: hien thi thong tin cua 2 sv ho nguyen dau tien

select top 2 * from sv

where ht like 'nguyen %'

--vd3: hien thi thong tin cua sv: masv, ht, tuoi

select masv, ht, tuoi=YEAR(getdate())-YEAR(ngaysinh)

from sv

--

select masv, ht, tuoi=YEAR(getdate())-YEAR(ngaysinh)

from sv

order by YEAR(getdate())-YEAR(ngaysinh)

--vd4: thong tin cua 1 sinh vien co dieml1 cua cac mon >=8,

--masv, ht, dieml1

select top 1 sv.masv, ht, dieml1

from sv, kq

where sv.masv =kq.masv and kq.dieml1>=8

Page 6: chua bai tap-on tap

6

---

TOP (expression) [PERCENT]

[ WITH TIES ]

select top 4 masv, ht, tuoi=YEAR(getdate())-YEAR(ngaysinh)

from sv

--

select top 4 WITH TIES masv, ht, tuoi=YEAR(getdate())-YEAR(ngaysinh)

from sv

order by YEAR(getdate())-YEAR(ngaysinh) desc

--

select * from mh

--vd5: hien thi thong tin cuA CAC mh co stc cao nhat

--c1:

select mamh, tenmon, sotc as maxstc from mh

where sotc>=all(select sotc from mh)

--c2

select top 1 with ties mamh, tenmon, sotc

from mh

order by sotc desc

--vd6: tinh so luong sv cua CSDL

select count(masv) as slsv from sv

--vd7: tinh so luong sv cua moi lop

--malop, tenlop, slsv

select lop.malop,tenlop, slsv= count(masv)

from lop left join sv on lop.malop=sv.malop

group by lop.malop,tenlop

--c2

select lop.malop,tenlop, slsv= count(masv)

from lop , sv

where lop.malop=sv.malop

group by lop.malop,tenlop

--vd8 hien thi slsv cua lop

--co cac ma '101091' va '601112'

--c1

select lop.malop,tenlop, slsv= count(masv)

from lop left join sv on lop.malop=sv.malop

where lop.malop ='101091' or lop.malop= '601112'

group by lop.malop,tenlop

--c2

select lop.malop,tenlop, slsv= count(masv)

from lop left join sv on lop.malop=sv.malop

where lop.malop in ('101091','601112')

group by lop.malop,tenlop

--vd9: tinh diem tbl1 thuoc ki 1 cua moi sv

--masv, ht, diemtbl1

select sv.masv ,ht,

diemtbl1 = round(SUM(dieml1*sotc)/SUM(sotc),2)

from sv, kq, mh

where sv.masv =kq.masv and kq.mamh =mh.mamh and kyhoc=1

group by sv.masv ,ht

--vd10: hien thi thong tin cua cac sv co diemtbl1 thuoc

--ki 1>=6.6

select sv.masv ,ht,

diemtbl1 = round(SUM(dieml1*sotc)/SUM(sotc),2)

from sv, kq, mh

where sv.masv =kq.masv and kq.mamh =mh.mamh and kyhoc=1

Page 7: chua bai tap-on tap

7

group by sv.masv ,ht

having round(SUM(dieml1*sotc)/SUM(sotc),2)>=6.6

---vd11: hien thi thong tin cua cac sv co diemtbl1 cao nhat

--thuoc ki 1

select top 1 with ties sv.masv ,ht,

diemtbl1 = round(SUM(dieml1*sotc)/SUM(sotc),2)

from sv, kq, mh

where sv.masv =kq.masv and kq.mamh =mh.mamh and kyhoc=1

group by sv.masv ,ht

order by round(SUM(dieml1*sotc)/SUM(sotc),2) desc

--vd12: hien thi: slmh, sumsotc, avgsotc, maxsotc, minsotc

select COUNT(mamh) as slmh,SUM(sotc) as sumsotc,

avg(sotc) as avgsotc, MAX(sotc) as maxsotc,

MIN(sotc) as minsotc

from mh

--vd13: hien thi tt cua sv: masv, ht, gt

--va thong ke slsv trong bang sv

select masv, ht, gt

from sv

compute count(masv)

--

select * from mh

--compute count(mamh),sum(sotc), max(sotc), avg(sotc), min(sotc)

compute max(sotc)

--

select MAX(sotc) from mh

--vd14

--group by: --vd7: tinh so luong sv cua moi lop

--malop, tenlop, slsv

select lop.malop,tenlop,slsv= count(masv)

from lop , sv

where lop.malop=sv.malop

group by lop.malop,tenlop

--compute by

select lop.malop,tenlop, sv.masv, ht

from lop , sv

where lop.malop=sv.malop

order by lop.malop,tenlop

compute count(sv.masv) by lop.malop,tenlop

--vd15

select sv.masv ,ht,

diemtbl1 = round(SUM(dieml1*sotc)/SUM(sotc),2) into kqsv

from sv, kq, mh

where sv.masv =kq.masv and kq.mamh =mh.mamh and kyhoc=1

group by sv.masv ,ht

--Hien thi thong tin cua bang kqsv: masv, ht, diemtbl1, hocluc

select masv, ht, diemtbl1,

hocluc= case

when diemtbl1>=9 then 'xuat sac'

when diemtbl1>=8 then 'Gioi'

when diemtbl1>=7 then 'Kha'

when diemtbl1>=6 then 'TB'

else 'Kem'

end

Page 8: chua bai tap-on tap

8

from kqsv

--vd16: 2 bang sv, sv2 co cau truc giong nhau

--tren 3 cot: masv, ht, gt

--yeu cau: chen 2 ban ghi dau tien cua

--bang sv vao bang sv2

insert into sv2

select top 2 masv, ht, gt from sv

--

select * into svtam from sv

--sua (thay doi) que cua sv co ma sv01 thanh hai duong

update svtam

set qq='Hai duong'

where masv='sv01'

--sua thong tin ve qq cua 3 sv dau tien trong ds thanh 'Ninh Binh'

update top (3) svtam

set qq='Ninh Binh'

--xoa thong tin cua cac sv nu khoi bang svtam

delete from svtam

where gt='nu'

--xoa tt cua 4 sv dau tien trong bang svtam

delete top (4) from svtam

select * from svtam

---

--Phan hang rank()

--vd1: phan hang mon hoc theo sotc

select mamh, tenmon,sotc,

Rank() over (order by sotc) as rank_sotc

from mh

--

select mamh, tenmon,sotc,

Rank() over(partition by sotc order by mamh) as ranks

from mh

--- phan hang theo vung

Select masv, HT, YEAR(ngaysinh) AS namsinh, GT,

rank()over (partition by gt order by YEAR(ngaysinh) desc)

as xephang

from SV

---

Select masv, HT, YEAR(ngaysinh) AS namsinh, GT,

rank()over (partition by masv order by YEAR(ngaysinh) desc)

as xephang

from SV

--vd2: xep hang theo tuoi cua sv dua vao DENSE_RANK

select masv, ht, datediff(yy, ngaysinh,getdate())as tuoi

,DENSE_RANK() OVER

(ORDER BY datediff(yy, ngaysinh, getdate())) AS 'XHANG_DENSE_RANK'

FROM sv

--where datediff(yy, ngaysinh, getdate()) is not null

--VD3:phân hạng theo tuổi dùng hàm row_number()

select masv, ht, datediff(yy, ngaysinh, getdate())AS TUOI

Page 9: chua bai tap-on tap

9

,ROW_NUMBER() OVER

(ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Row Number'

FROM sv

--vd4: phan hang voi ham NTILE

select masv, ht, datediff(yy, ngaysinh, getdate())as tuoi

,NTILE(7) OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Quartile'

FROM Sv

-- truy van co tat cac cac hàm phan hang

select masv, ht, datediff(yy, ngaysinh, getdate())as tuoi

,ROW_NUMBER() OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Row Number'

,RANK() OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Rank'

,DENSE_RANK() OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Dense Rank'

,NTILE(5) OVER (ORDER BY datediff(yy, ngaysinh, getdate())) AS 'Ntile'

FROM sv

where datediff(yy, ngaysinh, getdate()) is not null

---

select @@VERSION

select masv, hoten, ROW_NUMBER()

OVER (ORDER BY masv) AS 'Row Number'

from sv

---

select masv, mamh, dieml1,

RANK() OVER (ORDER BY dieml1) AS 'Rank'

from kq

order by masv

--khai bao bien

declare @i int

set @i=100

print 'gt i='+cast(@i as char(5))

print @i

thủ tục

-vd2: viết thủ tục lưu có tác dụng nhập dữ liệu vào bảng lop

-- biết rằng thông tin cần nhập được truyền thông qua các tham số

create proc sp_nhaplop

(@mal char(10), @tenl nvarchar(30))

as

begin

insert into lop values(@mal, @tenl)

end

---,

create proc chenSV (

@malop char(10),

@Masv char(10),

@Hoten nvarchar(50),

@NS datetime,

@QQ nvarchar(50),

@kqht float

)as

begin

if(exists (select Malop from lop where malop =@malop))

insert into sv values (@malop, @masv, @hoten,@ns, @qq, @kqht)

else

print ‘ Không chèn được’

end

Page 10: chua bai tap-on tap

10

----

exec sp_nhaplop '101131', 'Tk11.3'

select * from lop

--vd3: viết thủ tục lưu có tác dụng tính số lượng sv của một lớp

-- biêt rằng, thủ tục này có tham số truyền vào là mã lớp

create proc sp_slsv

(@malop char(10))

as

begin

select lop.malop, COUNT(sv.masv)as sl

from lop left join sv on lop.malop =sv.malop

group by lop.malop

having lop.malop =@malop

end

---

exec sp_slsv '101091'

---

alter proc sp_slsv

(@malop char(10)='101091')

as

begin

declare @ma char(10),@ssv int

select @ma=lop.malop, @ssv=COUnT(sv.masv)

from lop left join sv on lop.malop =sv.malop

group by lop.malop

having lop.malop =@malop

print 'mã lớp:'+@ma +'có số sv là:'+

cast(@ssv as char(3))

end

---

exec sp_slsv

exec sp_slsv '101131'

---vd4

create proc dieml1

@masv char(10)

as

select sv.masv, sum(dieml1*sotc)/sum(sotc) as dtbl1

from sv, mh, diem

where sv.masv= diem.masv and diem.mamon= mh.mamon

and sv.masv=@masv

group by sv.masv

---

---Ví du: tra ve so ngày trong tháng khi biet tháng và nam

--VD2:

Create Proc spr_Days (@Thang Int, @Nam Int)

As

Declare @SN Int

Set @SN = Case

When @Thang In (1,3,5,7,8,10,12) Then 31

When @Thang In (4,6,9,11) Then 30

When @Nam % 4 = 0 Then 29

Else 28

End

--Return @SN

print @sn

Go

exec spr_Days 2, 2012

exec spr_Days 2, 2013

Page 11: chua bai tap-on tap

11

---

--Ví du: TINH TONG S = 1 + 3 + 5 +… + (2N-1)

alter Proc TongLe ( @N int )

AS

DECLARE @I int, @S int

SET @I = 1

SET @S = 0

WHILE @I <= 2*@N -1

BEGIN

--WAITFOR DELAY '00:00:00.001'

Set @S = @S + @I

Set @I = @I + 2

END

--Return @S

print @S

exec TongLe 5

---xóa thủ tục lưu

drop proc sp_nhaplop

---

--vd3_tong 2 so, co tham so output

create procedure Tong_Output

@a int,

@b int,

@c int output

as

select @c = @a + @b

print @c

Trigger --vd2--trigger cho su kien insert tren bang tt t/m:

-- moi de tai co toi da 3 sv tham gia

CREATE trigger sLsv_dt on tt

for insert

as

begin

if((select count (t1.masv)

from tt as t1, inserted t2

where t1.madt =t2.madt)<=3)

BEGIN

print 'da nhap du lieu thanh cong'

end

else

begin

print 'Khong the co qua 3 sv tham gia 1 de tai'

rollback tran

end

end

go

--kiem tra trigger

use ttsv

SELECT * FROM tt ORDER BY Madt

SELECT * FROM sv

SELECT * FROM dt

--

insert into tt

Page 12: chua bai tap-on tap

12

values('sv6','dt2','Hung Yen', 7.8)

--

insert into tt

values('sv5','dt1','lào cai', 7.8)

--

---sua trigger

alter trigger sosv_dt on tt

for insert

as

begin

if((select count (t1.masv)

from tt as t1, inserted t2

where t1.madt =t2.madt)<=3)

BEGIN

print 'da nhap du lieu thanh cong'

--lay thong tin ve ten de tai

declare @tdt varchar(30), @sosv int

select @tdt=t1.tendt

from dt as t1, tt as t2, inserted as t3

where t1.madt=t2.madt and t2.madt=t3.madt

--lay so luong sv tuong ung

select @sosv=count(t1.masv)

from tt as t1, inserted t2

where t1.madt=t2.madt

---in: ten dt, soluong sv

print 'De tai: '+@tdt +' hien co: '+cast(@sosv as varchar)+ ' sinh vien'

end

else

begin

print 'Khong the co qua 3 sv tham gia 1 de tai'

rollback tran

end

end

go

--VD3: khong cho phep sua du lieu cua

--cot hoten trong bang sV

select * from sv

update sv

set GT='NU'

where masv='sv03'

---

SELECT * FROM SV

---

create TRIGGER NoUpdateHT

ON sV

FOR UPDATE AS

IF UPDATE (HT)

BEGIN

PRINT 'Khong duoc UPDATE tren cot ht'

ROLLBACK TRANSACTION

END

---kiem tra trigger

update sv

Page 13: chua bai tap-on tap

13

set ht='tran thi anh'

where masv='sv2'

---vi du 4: viet trigger cho su kien xoa du lieu tren

--bang lop

--thi thong tin lien quan cung bi xoa theo

--

ALTER TABLE DT ALTER COLUMN MADT NCHAR(10) NOT NULL

ALTER TABLE DT ADD CONSTRAINT DT_P PRIMARY KEY(MADT)

drop trigger deletelop

exec sp_helptext xoa_lop

SELECT * FROM LOP

SELECT * FROM SV

create trigger deletelop on lop

for delete

as

begin

if(@@rowcount <=0)

print 'khong co lop nao trong bang'

else

begin

delete sv from SV as s, deleted as d

where s.malop=d.malop

end

end

go

---

delete from lop

where malop='tk71'

select * from lop

select * from sv

EXEC SP_HELPTEXT XOA_LOP

--VD5:

-- viet trigger tren bang lop:

--chi xoa nhung lop chua co sv

---

create TRIGGER xoa_ttlop ON lop

INSTEAD OF delete

AS

BEGIN

If (Select count(*) from sv, Deleted d

where sv.malop=d.malop)>0

BEGIN

RAISERROR ('khong xoa duoc', 16, 1)

ROLLBACK TRAN

END

ELSE

BEGIN

DELETE FROM lop WHERE

malop IN(SELECT malop FROM DELETED)

PRINT 'xoa duoc'

END

Page 14: chua bai tap-on tap

14

END

GO

---

select * from lop

select * from sv

--thu xoa

delete from LOP

where MALOP='101121'

delete from LOP

where MALOP='101104'

---vd: thực hiệnviệc cập nhật điểm trên cột điểm l1 và điểm l2

create TRIGGER In_up_diem

ON dbo.Diem

FOR INSERT, UPDATe

AS

--Bang diem(Masv nchar(10),Mamon chAr(10),

--DiemL1 float,DiemL2 floAT)

Declare @msv nchar(10)

Declare @mamh char(10)

declare @dl1 float

declare @dl2 float

-- Lay gia tri cho 4 truong

Set @msv=(Select Masv from inserted )

set @mamh=(select mamon from inserted)

set @dl1=(select dieml1 from inserted)

set @dl2=(select dieml2 from inserted)

-- TH1. Neu masv ton tai roi, thi tien hanh Update

if(exists(select masv from diem where

masv=@msv))

begin

-- Ktra diemlan1

if(@dl1<5)

Update Diem set dieml2=@dl2

where masv=@msv and mamon=@mamh

else

begin

set @dl2=null

Update Diem set dieml2 =@dl2

where Masv=@msv and mamon=@mamh

end

end

-- TH2. Neu masv chua ton tai,

-- nhap moi Insert

else

Begin

-- kiem tra diem lan 1

if (@dl1<5)

Insert into Diem

values(@msv,@mamh, @dl1,@dl2)

Page 15: chua bai tap-on tap

15

else

begin

set @dl2 =null

Insert into Diem

values (@msv,@mamh,@dl1,@dl2)

End

end

-----

insert into diem values ('sv04', 'mh4',1,0)

insert into diem values ('sv04', 'mh2',8,6)

--

update diem

set dieml2=9

where masv='sv03' and mamon='mh1'

--

update diem

set dieml2=9

where masv='sv04' and mamon='mh1'