Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

Nguyễn Văn Hải – 211242201

--V. Tạo TRIGGER

--1. Kiểm soát giới tính của nhân viên chỉ được nhập giá trị là ‘Nam’ hoặc ‘Nữ’

CREATE OR ALTER TRIGGER trig_cau_1


ON NHANVIEN
AFTER INSERT, UPDATE
AS
BEGIN
-- Check the gender values
IF EXISTS (
SELECT 1
FROM inserted
WHERE [Gioi Tinh] NOT IN ('Nam', 'Nữ')
)
BEGIN
ROLLBACK;
PRINT 'LOI'
RETURN;
END;
END;
INSERT INTO NHANVIEN ([MaNV],[HoTen],[QueQuan],[Gioi
Tinh],[SDT],[NgaySinh],[NgayLV],[HSL])
VALUES
('0006', 'TEST', 'ABC' ,'1', '0978652365', '2000-09-21 00:00:00.000', NULL
,NULL)

--2. Kiểm soát ngày vào làm (NgayLV) của nhân viên phải sau ngày sinh và đảm bảo
--nhân viên trên 18 tuổi

CREATE OR ALTER TRIGGER trig_cau_2


ON NHANVIEN
AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @MinAge INT
SET @MinAge = 18

IF EXISTS (
SELECT 1
FROM inserted
WHERE DATEDIFF(YEAR, [NgaySinh], GETDATE()) < @MinAge
)
BEGIN
ROLLBACK;
PRINT 'PHAI TREN 18 TUOI'
RETURN;
END;
IF EXISTS (
SELECT 1
FROM inserted
WHERE [NgayLV] < [NgaySinh]
)
BEGIN
ROLLBACK;
PRINT 'NGAY VAO LAM PHAI SAU NGAY SINH'
RETURN;
END;
END;
INSERT INTO NHANVIEN ([MaNV],[HoTen],[QueQuan],[Gioi
Tinh],[SDT],[NgaySinh],[NgayLV],[HSL])
VALUES
('0006', 'TEST', 'ABC' ,'Nữ', '0978652365', '2020-09-21 00:00:00.000', '2020-
09-20 00:00:00.000' ,NULL)
INSERT INTO NHANVIEN ([MaNV],[HoTen],[QueQuan],[Gioi
Tinh],[SDT],[NgaySinh],[NgayLV],[HSL])
VALUES
('0006', 'TEST', 'ABC' ,'Nữ', '0978652365', '2000-09-21 00:00:00.000', '2000-
09-20 00:00:00.000' ,NULL)

--3. Thêm trường Đơn vị tính vào bảng Hàng hóa. Kiểm soát đơn vị tính khi nhập
--hàng hóa chỉ được chứa từ “Cái”, “Hộp”, “Thùng”, “Kg”, “Chiếc”
ALTER TABLE HANGHOA
ADD DonViTinh nvarchar(50) NULL;

CREATE OR ALTER TRIGGER trig_cau_3


ON HANGHOA
INSTEAD OF INSERT
AS
BEGIN
IF NOT EXISTS (
SELECT 1
FROM inserted
WHERE DonViTinh IN (N'Cái', N'Hộp', N'Thùng', N'Kg', N'Chiếc')
)
BEGIN
ROLLBACK;
PRINT 'NHAP VAO PHAI LA : "Cái", "Hộp", "Thùng", "Kg", HOAC "Chiếc".'
RETURN;
END;

INSERT INTO HANGHOA (MaHH, HangSX, TenHH, GiaBan, DacDiem, DonViTinh)


SELECT MaHH, HangSX, TenHH, GiaBan, DacDiem, DonViTinh
FROM inserted;
END;

INSERT INTO HANGHOA (MaHH, HangSX, TenHH, GiaBan, DacDiem, DonViTinh)


VALUES (N'0017', N'Sony', N'C3', 3500000, NULL, N'Cái1');

--4. Tạo trigger cập nhật tự động giá của bảng hàng hóa sang bảng chi tiết hóa đơn
--mỗi khi thêm mới bản ghi
ALTER TABLE [dbo].[CT_HOADON]
ADD GiaBaN FLOAT NULL;

CREATE OR ALTER TRIGGER trig_cau_4


ON HANGHOA
AFTER INSERT,UPDATE
AS
BEGIN
UPDATE [dbo].[CT_HOADON]
SET GiaBan = i.GiaBan
FROM [dbo].[CT_HOADON] c
INNER JOIN inserted i ON c.MaHH = i.MaHH;
END;

--5. Thêm trường ChietKhau vào bảng CT_Hoadon và cập nhật tự động trường này
--bằng 15% giá bán
ALTER TABLE CT_HOADON
ADD ChietKhau float NULL;
CREATE OR ALTER TRIGGER trig_cau_5
ON CT_HOADON
AFTER INSERT,UPDATE
AS
BEGIN

UPDATE CT_HOADON
SET ChietKhau = 0.15 * ISNULL(i.GiaBan,0)
FROM CT_HOADON c
INNER JOIN inserted i ON c.MaHD = i.MaHD AND c.MaHH = i.MaHH;
END;

--6. Thêm Trường ThanhTien và cập nhật tự động cho trường này
ALTER TABLE HOADON
ADD ThanhTien float NULL;

ALTER TABLE [dbo].[CT_HOADON]


ADD ThanhTien float NULL;

CREATE OR ALTER TRIGGER trig_cau_6


ON CT_HOADON
AFTER INSERT, UPDATE, DELETE
AS
BEGIN

UPDATE h
SET ThanhTien = ISNULL(SL * GIABAN - SL * CHIETKHAU, 0)
FROM CT_HOADON h
WHERE h.MaHD IN (SELECT MaHD FROM inserted) OR h.MaHD IN (SELECT MaHD FROM deleted);

UPDATE h
SET ThanhTien = ISNULL((SELECT SUM(i.ThanhTien) FROM CT_HOADON i WHERE i.MaHD =
h.MaHD), 0)
FROM HOADON h
WHERE h.MaHD IN (SELECT MaHD FROM inserted) OR h.MaHD IN (SELECT MaHD FROM deleted);
END;

--7. Cập nhật lại giá của bảng hàng hóa sang bảng chi tiết hóa đơn

--NHU CAU 4
--VI. Tạo FUNCTION
--1. Tạo hàm lấy danh sách nhân viên theo quê quán
CREATE OR ALTER FUNCTION FUNC_CAU1 (@QUEQUAN nvarchar(max))
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM NHANVIEN
WHERE QueQuan LIKE N'%' + @QUEQUAN
);

SELECT * FROM FUNC_CAU1(N'Hà Nội')

--2. Tạo hàm lấy danh sách hóa đơn theo nhân viên và ngày (ngày/tháng/năm)
CREATE OR ALTER FUNCTION FUNC_CAU2 (@MANHANVIEN nvarchar(50), @NGAY nvarchar(10))
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM HOADON
WHERE MaNV = @MANHANVIEN
AND FORMAT(NgayLap, 'dd/MM/yyyy') = @NGAY
);

SELECT * FROM FUNC_CAU2(N'0001','16/03/2015')

--3. Tạo hàm tính tổng tiền của từng hóa đơn với mã hóa đơn là tham số đầu vào
CREATE OR ALTER FUNCTION FUNC_CAU3 (@MAHOADON nvarchar(50))
RETURNS float
AS
BEGIN
DECLARE @TONGTIEN float;

SELECT @TONGTIEN = ThanhTien


FROM HOADON CH
WHERE CH.MaHD = @MAHOADON;

RETURN @TONGTIEN;
END;

DECLARE @TONGTIEN FLOAT


SET @TONGTIEN = dbo.FUNC_CAU3('0001');
PRINT @TONGTIEN

--4. Tạo hàm lấy danh sách nhà cung cấp theo mã hàng
CREATE OR ALTER FUNCTION FUNC_CAU4 (@MAHANG nvarchar(50))
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM NHACUNGCAP
WHERE MaNCC IN (SELECT MaNCC
FROM PHIEUNHAP
WHERE MaPN IN (SELECT MaPN
FROM CT_PHIEUNHAP
WHERE MAHH = @MAHANG)
)
);

SELECT * FROM FUNC_CAU4('0001')


--5. Tạo hàm lấy danh sách các mặt hàng theo mã nhà cung cấp
CREATE OR ALTER FUNCTION FUNC_CAU5 (@MANCC nvarchar(50))
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM HANGHOA
WHERE MAHH IN (SELECT MAHH
FROM CT_PHIEUNHAP
WHERE MaPN IN (SELECT MaPN
FROM PHIEUNHAP
WHERE MaNCC = @MANCC)
)
);

--6. Cho danh sách các khách hàng ở một quận nào đó
CREATE OR ALTER FUNCTION FUNC_CAU6 (@QUAN nvarchar(50))
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM NHANVIEN
WHERE QueQuan LIKE '%' + @QUAN + '%'
);

SELECT * FROM FUNC_CAU6(N'Cầu Giấy')

You might also like