Du Lieu va Bai tap 04 - 04 - Bai giai

8 13 0
Du Lieu va Bai tap 04 - 04 - Bai giai

Đang tải... (xem toàn văn)

Thông tin tài liệu

Dữ liệu quản lý vé cụm rạp chiếu phim CumRap (MaCum varchar(5), TenCum nvarchar(50), DiaChi nvarchar(100)) Rap (MaRap varchar(5), TongGhe int, MaCum varchar(5)) ngồi TongGhe: tổng số chổ LoaiGhe (MaLoaiGhe varchar(5), TenLoaiGhe nvarchar(50) , SLGhe int) Ví dụ: Loại ghế đôi thật sư ghế đánh số số lượng ghế (Slghe) RapGhe (MaRap varchar(5), MaHang char(1), SoGheBatDau int, SoGheKetThuc int, MaLoaiGhe varchar(5)) TheLoai (MaTheLoai varchar(5), TenTheLoai nvarchar(50)) Phim (MaPhim varchar(10), TenPhim nvarchar(50), MaTheLoaiChinh varchar(5), ThoiLuong int, CoLa3D bit, CoLongTieng bit) PhimTheLoai (MaPhim varchar(10), MaTheLoai varchar(5)) KeHoach (MaPhim varchar(10), MaCum varchar(5), NgayKhoiChieu date, NgayKetThuc date, GhiChu nvarchar(100)) SuatChieu (MaSuat varchar(3), GioBatDau int, PhutBatDau int) LichChieu (MaPhim varchar(10), MaRap varchar(5), NgayChieu date, ChuoiMaSuat nvarchar(100)) ChuoiMaSuat: Ghi nhận dãy mã suất chiếu ngày mà rạp chiếu NgheNghiep (MaNghe varchar(5), TenNghe nvarchar(100)) ThanhPho (MaThanhPho varchar(5), TenThanhPho nvarchar(100)) Quan (MaQuan varchar(5), TenQuan nvarchar(100), MaThanhPho varchar(5)) ThanhVien (MaThanhVien varchar(5), TenThanhVien nvarchar(50), NamSinh int, GioiTinh bit, MaQuan varchar(5), MaNghe varchar(5)) BangGia (MaLoaiGhe varchar(5), MaSuat varchar(3), NgayBatDau date, Gia float, GhiChu nvarchar(100)) Ve (MaSoVe varchar(20), MaPhim varchar(10), MaRap varchar(5), NgayChieu date, NgayMua date, MaSuat varchar(3), MaHang char(1), So int, MaLoaiGhe varchar(5), MaThanhVien varchar(5), GiaGoc float, SoTienPhuThu float, SoTienGiam float) GiamGia (MaGiam int, MaPhim varchar(10), MaRap varchar(5), Thu int, Ngay date, MaSuat varchar(3), MaLoaiGhe varchar(5), NgayBatDauApDung date, LoaiHinhGiam int, GiaMoi float, PhanTramGiam float) GiamGiaTheoNguoi (MaGiam int, Tuoi int, GioiTinh bit, MaNghe nvarchar(5), NgayBatDauApDung date, LoaiHinhGiam int, GiaMoi float, PhanTramGiam float) Bài làm trigger Viết trigger để thêm rạp chiếu phim rạp phải có tổng số ghế khơng vượt q 200 ghế Create trigger abc on rap for insert as Begin Declare @sg int Select @sg = tongghe from inserted If (@sg > 200) Rollback tran end Viết trigger để thêm rạp chiếu phim cụm rạp mà rạp thuộc vào khơng có q rạp với tổng số ghế rạp không 200 C1 Nguyen Du R1 250 R2 150 R3 215 R4 215 R5 100 Them vao R8 C1 180 R8 180 R10 C1 230 R10 230 x Create trigger c2 on rap for insert as Begin Declare @mac nvarchar(5) Select @mac = macum from inserted Declare @t int Select @t = count(marap) from rap where macum = @mac and tongghe > 200 If (@t > 3) Rollback tran end Viết trigger để thoả mãn điều kiện phim có tối đa thể loại mà thuộc vào (tính ln thể loại chính) Và điều kiện mã thể loại khơng ghi bảng phim thể loại Xét cho mã thể loại khơng nằm phim thể loại va phim khong qua the loai Vay bang phim the loai chi có the toi da la the loai ma thoi Bảng phimtheloai, khóa trường, nên khơng có update mà có xóa thêm Xóa khơng ảnh hưởng đến điều kiện đề Create trigger c3 on phimtheloai for insert as Begin Declare @tl varchar(5), @mp varchar(10) Select @tl = matheloai, @mp = maphim from inserted If exists(select from phim where maphim = @mp and matheloaichinh = @tl) Rollback tran Else Declare @t int Select @t = count(matheloai) from phimtheloai Where maphim = @mp If (@t > 4) Rollback tran End Khi them moi phim, thi phimtheloai chua có  khong ảnh hưởng điều kiện đề Khi xóa phim, phim thể loại bị xóa theo  khơng ảnh hưởng điều kiện đề (làm dựa cascade delete) Vay chi có update phim mà update trường matheloaichinh Th1: chỉnh mã thể loại từ TL1 sang TL2 mà TL2 khơng nằm dánh sách thể loại phim bảng phimtheloai  không vi phạm điều kiện đề Th2: chỉnh mã thể loại từ TL1 sang TL2 mà TL2 nằm dánh sách thể loại phim Như vi phạm điều kiện thể loại khơng thuộc vào bảng phimtheloai  không cho chỉnh  Tạo đpas án giải với cách thức xử lý vi phạm Create trigger c3_1 on phim for update as Begin If (update(matheloaichinh)) Begin Declare @tlchinh_moi varchar(5), @mp varchar(10) Select @mp = maphim, @tlchinh_moi = matheloaichinh From inserted If exists(select from phimtheloai where maphim = @mp and matheloai = @tlchinh_moi) rollback tran end end Vay chi có update phim mà update trường matheloaichinh Th1: chỉnh mã thể loại từ TL1 sang TL2 mà TL2 không nằm dánh sách thể loại phim bảng phimtheloai  khơng vi phạm điều kiện đề Th2: chỉnh mã thể loại từ TL1 sang TL2 mà TL2 nằm dánh sách thể loại phim Như vi phạm điều kiện thể loại khơng thuộc vào bảng phimtheloai  xóa dịng mã phim TL2 bảng phim the loai  Tạo đpas án giải với cách thức xử lý vi phạm Create trigger c3_2 on phim for update as Begin If (update(matheloaichinh)) Begin Declare @tlchinh_moi varchar(5), @mp varchar(10) Select @mp = maphim, @tlchinh_moi = matheloaichinh From inserted If exists(select from phimtheloai where maphim = @mp and matheloai = @tlchinh_moi) delete from phimtheloai where maphim = @mp and matheloai = @tlchinh_moi end end Viết trigger để thoả mãn điều kiện mã thể loại phim khơng đuọc phép nằm bảng PhimTheLoai phim Viết trigger để thoả mãn điều kiện: kế hoach chiếu phim phải có số ngày chiếu khơng q 20 ngày Viết trigger để xoá thành viên phải đảm bảo: xố thành viên năm năm trước thành viên không coi phim Create trigger c6 on thanhvien for delete as Begin Declare @mtv varchar(5) Select @mtv = mathanhvien from deleted If exists( select masove from ve Where mathanhvien = @mtv and (Year(ngaychieu) = year(getdate()) or Year(ngaychieu) = year(getdate()) - 1) ) Rollback tran end Viết trigger để xoá kế hoạch chiếu phim phải đảm bảo điều kiện: cho phép xoá kế hoach ngày khỏi chiếu thật chưa đến, hay khơng có lịch chiếu phim kế hoạch Viết trigger để thêm lịch chiếu phim phải phù hợp (có nghĩa là: ngày chiếu lịch chiếu phim phải thuộc vào đoạn thời gian kế hoạch chiếu phim đ9ó cụm rạp On lichchieu for insert C1 {R1,R3} Lich chieu P1 R1 2/6/2021 P1 P1 C2 {R4, R6} Ke hoach P1 C1 1/6/20218/6/2021 P1 C2 5/6/202112/6/2021 R5 3/6/2021 X R4(c2) 3/6/2021X P1 R3 11/6/2021  P1 C1 11/6/2021 Create trigger c8 on lichchieu for insert as Begin Declare @mp varchar(10), @mc varchar(5), @ngay date Select @mp = ins.maphim, @mc = r.macum, @ngay = ins.ngaychieu From inserted ins inner join rap r On r.marap = ins.marap If not exists (select * from kehoach where Maphim = @mp and macum = @mc and @ngay between ngaykhoichieu and ngayketthuc) Rollback tran end Viết trigger để them vé, phải đảm bảo phim, mã rạp, ngày chiếu suất chiếu vé thêm vào phải có lịch chiếu phim 10.Viết trigger để thêm phim tự động thêm dòng bảng PhimTheLoai ghi nhận thể loại phim (Giả sử thể loại phim ghi nơi PhimTheLoai Phim) Create trigger c10 on phim for insert as Begin ‘ ta lay the loai chinh va ma phim ma nguoi dung muon them vao Declare @mp varchar(10), @tlc varchar(5) Select @mp = maphim, @tlc = matheloaichinh from inserted Insert into phimtheloai (maphim, matheloai) values (@mp,@tlc) end hay create trigger c10_1 on phim for insert as begin insert into phimtheloai (maphim, matheloai) select maphim, matheloaichinh from inserted end Sử dụng trigger SQL qua ví dụ Trending This post has been more than years since it was last updated Trigger ? Hiểu đơn giản Trigger stored procedure khơng có tham số Trigger thực thi cách tự động ba câu lệnh Insert, Update, Delete làm thay đổi liệu bảng có chứa trigger Cú pháp Trigger CREATE TRIGGER tên_trigger ON tên_bảng {FOR/INSTEAD OF} {DELETE, INSERT, UPDATE} AS câu_lệnh_sql Trigger dùng làm ? • Trigger thường sử dụng để kiểm tra ràng buộc (check constraints) nhiều quan hệ (nhiều bảng/table) nhiều dịng (nhiều record) bảng • Ngồi việc sử dụng Trigger để chương trình có hàm chạy ngầm nhằm phục vụ trường hợp hữu hạn thường khơng sử dụng cho mục đích kinh doanh giao dịch Đọc thêm Bài tốn đặt • Bạn có bảng kho hàng đặt hàng liên kết với mã hàng • Khi người dùng đặt hàng tự động cập nhật số lượng tồn bảng kho hàng Giải pháp • Khi người dùng đặt hàng ta có loại thao tác với CSDL : Insert, Delete, Update • Vậy cần tạo trigger tương ứng ok • Người dùng đặt hàng: Số lượng kho = Số lượng cịn - Số lượt đặt • Người dùng hủy khơng đặt hàng nữa: Số lượng cịn kho = Số lượng cịn + Số lượt đặt • Người dùng cập nhật Số lượng đặt => Số lượng tăng giảm tùy ý Vấn đề • Ở trường hợp insert delete ta thực bình thường Nhưng trường hợp update Số lượng hàng tồn sảy trường hợp sau Số lượng đặt ban đầu = sau tăng lên 10 => số lượng kho giảm 10 tương ứng Số lượng đặt lúc = 10 sau giảm xuống => số lượng kho tăng tương ứng • Tận dụng việc sql câu lệnh update = Insert new row To Delete old row cõ nghĩa thực update CSDL sql chạy việc insert liệu trước sau xóa bảng cũ Giải vấn đề • Tận dụng việc sử dụng Trigger tồn bảng inserted deleted ta rút công thức cập nhật trung trường hợp ... chinh va ma phim ma nguoi dung muon them vao Declare @mp varchar(10), @tlc varchar(5) Select @mp = maphim, @tlc = matheloaichinh from inserted Insert into phimtheloai (maphim, matheloai) values...GiamGia (MaGiam int, MaPhim varchar(10), MaRap varchar(5), Thu int, Ngay date, MaSuat varchar(3), MaLoaiGhe varchar(5), NgayBatDauApDung date, LoaiHinhGiam int, GiaMoi float, PhanTramGiam... rạp không 200 C1 Nguyen Du R1 250 R2 150 R3 215 R4 215 R5 100 Them vao R8 C1 180 R8 180 R10 C1 230 R10 230 x Create trigger c2 on rap for insert as Begin Declare @mac nvarchar(5) Select @mac

Ngày đăng: 22/05/2021, 10:48

Mục lục

    Cú pháp của Trigger

    Trigger dùng làm gì ?

    Giải quyết vấn đề

Tài liệu cùng người dùng

Tài liệu liên quan