Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 28 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
28
Dung lượng
462,08 KB
Nội dung
Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL Chương THỦ TỤC LƯU TRỮ, HÀM VÀ TRIGGER 5.1 Thủ tục lưu trữ (stored procedure) 5.1.1 Các khái niệm Như đề cập chương trước, SQL thiết kế cài đặt ngôn ngữ để thực thao tác sở liệu tạo lập cấu trúc sở liệu, bổ sung, cập nhật, xoá truy vấn liệu sở liệu Các câu lệnh SQL người sử dụng viết yêu cầu hệ quản trị sở liệu thực theo chế độ tương tác Các câu lệnh SQL nhúng vào ngơn ngữ lập trình, thơng qua chuỗi thao tác sở liệu xác định thực thi nhờ vào câu lệnh, cấu trúc điều khiển thân ngôn ngữ lập trình sử dụng Với thủ tục lưu trữ, phần khả ngơn ngữ lập trình đưa vào ngơn ngữ SQL Một thủ tục đối tượng sở liệu bao gồm tập nhiều câu lệnh SQL nhóm lại với thành nhóm với khả sau: • Các cấu trúc điều khiển (IF, WHILE, FOR) sử dụng thủ tục • Bên thủ tục lưu trữ sử dụng biến ngơn ngữ lập trình nhằm lưu giữ giá trị tính tốn được, giá trị truy xuất từ sở liệu • Một tập câu lệnh SQL kết hợp lại với thành khối lệnh bên thủ tục Một thủ tục nhận tham số truyền vào trả giá trị thông qua tham số (như ngôn ngữ lập trình) Khi thủ tục lưu trữ định nghĩa, gọi thơng qua tên thủ tục, nhận tham số truyền vào, thực thi câu lệnh SQL bên thủ tục trả giá trị sau thực xong Sử dụng thủ tục lưu trữ sở liệu giúp tăng hiệu sở liệu, mang lại lợi ích sau: • Đơn giản hoá thao tác sở liệu nhờ vào khả module hoá thao tác 104 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL • Thủ tục lưu trữ phân tích, tối ưu tạo nên việc thực thi chúng nhanh nhiều so với việc phải thực tập rời rạc câu lệnh SQL tương đương theo cách thơng thường • Thủ tục lưu trữ cho phép thực yêu cầu câu lệnh đơn giản thay phải sử dụng nhiều dịng lệnh SQL Điều làm giảm thiểu lưu thơng mạng • Thay cấp phát quyền trực tiếp cho người sử dụng câu lệnh SQL đối tượng sở liệu, ta cấp phát quyền cho người sử dụng thơng qua thủ tục lưu trữ, nhờ tăng khả bảo mật hệ thống 5.1.2 Tạo thủ tục lưu trữ Thủ tục lưu trữ tạo câu lệnh CREATE PROCEDURE với cú pháp sau: CREATE PROCEDURE tên_thủ_tục [(danh_sách_tham_số)] [WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS Các_câu_lệnh_của_thủ_tục Trong đó: tên_thủ_tục Tên thủ tục cần tạo Tên phải tuân theo qui tắc định danh không vượt 128 ký tự danh_sách_tham_số Các tham số thủ tục khai báo sau tên thủ tục thủ tục có nhiều tham số khai báo phân cách dấu phẩy Khai báo tham số tối thiểu phải bao gồm hai phần: • tên tham số bắt đầu dấu @ • kiểu liệu tham số Ví dụ: @mamonhoc RECOMPILE nvarchar(10) Thơng thường, thủ tục phân tích, tối ưu dịch sẵn lần gọi Nếu tuỳ chọn WITH RECOMPILE định, thủ tục dịch lại gọi 105 Khoa CNTT - Trường ĐHKH Huế ENCRYPTION Giáo trình SQL Thủ tục mã hoá tuỳ chọn WITH ENCRYPTION định Nếu thủ tục mã hoá, ta xem nội dung thủ tục các_câu_lệnh_của_thủ_tục Tập hợp câu lệnh sử dụng nội dung thủ tục Các câu lệnh đặt cặp từ khố BEGIN END khơng Ví dụ 5.1: Giả sử ta cần thực chuỗi thao tác sau sở liệu Bổ sung thêm môn học sở liệu có mã TI-005 số đơn vị học trình vào bảng MONHOC Lên danh sách nhập điểm thi môn sở liệu cho sinh viên học lớp có mã C24102 (tức bổ sung thêm vào bảng DIEMTHI ghi với cột MAMONHOC nhận giá trị TI-005, cột MASV nhận giá trị mã sinh viên học lớp có mã C24105 cột điểm NULL) Nếu thực yêu cầu thông qua câu lệnh SQL thông thường, ta phải thực thi hai câu lệnh sau: INSERT INTO MONHOC VALUES('TI-005','Cơ sở liệu',5) INSERT INTO DIEMTHI(MAMONHOC,MASV) SELECT ‘TI-005’,MASV FROM SINHVIEN WHERE MALOP='C24102' Thay phải sử dụng hai câu lệnh trên, ta định nghĩa môt thủ tục lưu trữ với tham số vào @mamonhoc, @tenmonhoc, @sodvht @malop sau: CREATE PROC sp_LenDanhSachDiem( @mamonhoc NVARCHAR(10), @tenmonhoc NVARCHAR(50), @sodvht SMALLINT, @malop NVARCHAR(10)) AS BEGIN INSERT INTO monhoc VALUES(@mamonhoc,@tenmonhoc,@sodvht) INSERT INTO diemthi(mamonhoc,masv) 106 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL SELECT @mamonhoc,masv FROM sinhvien WHERE malop=@malop END Khi thủ tục tạo ra, ta thực hai yêu cầu đặt cách đơn giản thơng qua lịi gọi thủ tục: sp_LenDanhSachDiem 'TI-005','Cơ sở liệu',5,'C24102' 5.1.3 Lời gọi thủ tục lưu trữ Như thấy ví dụ trên, thủ tục lưu trữ tạo ra, ta yêu cầu hệ quản trị sở liệu thực thi thủ tục lời gọi thủ tục có dạng: tên_thủ_tục [danh_sách_các_đối_số] Số lượng đối số thứ tự chúng phải phù hợp với số lượng thứ tự tham số định nghĩa thủ tục Trong trường hợp lời gọi thủ tục thực bên thủ tục khác, bên trigger hay kết hợp với câu lệnh SQL khác, ta sử dụng cú pháp sau: EXECUTE tên_thủ_tục [danh_sách_các_đối_số] Thứ tự đối số truyền cho thủ tục khơng cần phải tn theo thứ tự tham số định nghĩa thủ tục tất đối số viết dạng: @tên_tham_số = giá_trị Ví dụ 5.2: Lời gọi thủ tục ví dụ viết sau: sp_LenDanhSachDiem @malop='C24102', @tenmonhoc='Cơ sở liệu', @mamonhoc='TI-005', @sodvht=5 5.1.4 Sử dụng biến thủ tục Ngoài tham số truyền cho thủ tục, bên thủ tục cịn sử dụng biến nhằm lưu giữ giá trị tính tốn truy xuất từ sở liệu Các biến thủ tục khai báo từ khoá DECLARE theo cú pháp sau: DECLARE @tên_biến kiểu_dữ_liệu Tên biến phải bắt đầu ký tự @ tuân theo qui tắc định danh Ví dụ minh hoạ việc sử dụng biến thủ tục 107 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL Ví dụ 5.3: Trong định nghĩa thủ tục sử dung biến chứa giá trị truy xuất từ sở liệu CREATE PROCEDURE sp_Vidu( @malop1 NVARCHAR(10), @malop2 NVARCHAR(10)) AS DECLARE @tenlop1 NVARCHAR(30) DECLARE @namnhaphoc1 INT DECLARE @tenlop2 NVARCHAR(30) DECLARE @namnhaphoc2 INT SELECT @tenlop1=tenlop, @namnhaphoc1=namnhaphoc FROM lop WHERE malop=@malop1 SELECT @tenlop2=tenlop, @namnhaphoc2=namnhaphoc FROM lop WHERE malop=@malop2 PRINT @tenlop1+' nhap hoc nam '+str(@namnhaphoc1) print @tenlop2+' nhap hoc nam '+str(@namnhaphoc2) IF @namnhaphoc1=@namnhaphoc2 PRINT 'Hai lớp nhập học năm' ELSE PRINT 'Hai lớp nhập học khác năm' 5.1.5 Giá trị trả tham số thủ tục lưu trữ Trong ví dụ trước, đối số truyền cho thủ tục có lời gọi đến thủ tục biến, thay đổi giá trị biền thủ tục không giữ lại kết thúc trình thực thủ tục Ví dụ 5.4: Xét câu lệnh sau CREATE PROCEDURE sp_Conghaiso(@a AS SELECT @c=@a+@b INT,@b INT, @c INT) Nếu sau tạo thủ tục với câu lệnh trên, ta thực thi tập câu lệnh sau: DECLARE @tong INT 108 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL SELECT @tong=0 EXECUTE sp_Conghaiso 100,200,@tong SELECT @tong Câu lệnh “SELECT @tong” cuối loạt câu lệnh cho kết là: Trong trường hợp cần phải giữ lại giá trị đối số sau kết thúc thủ tục, ta phải khai báo tham số thủ tục theo cú pháp sau: @tên_tham_số kiểu_dữ_liệu OUTPUT @tên_tham_số kiểu_dữ_liệu OUT hoặc: lời gọi thủ tục, sau đối số truyền cho thủ tục, ta phải định thêm từ khoá OUTPUT (hoặc OUT) Ví dụ 5.5: Ta định nghĩa lại thủ tục ví dụ 5.4 sau: CREATE PROCEDURE sp_Conghaiso( @a @b @c INT, INT, INT OUTPUT) AS SELECT @c=@a+@b thực lời gọi thủ tục tập câu lệnh sau: DECLARE @tong INT SELECT @tong=0 EXECUTE sp_Conghaiso 100,200,@tong OUTPUT SELECT @tong câu lệnh “SELECT @tong” cho kết là: 300 5.1.6 Tham số với giá trị mặc định Các tham số khai báo thủ tục nhận giá trị mặc định Giá trị mặc định gán cho tham số trường hợp không truyền đối số cho tham số có lời gọi đến thủ tục Tham số với giá trị mặc định khai báo theo cú pháp sau: @tên_tham_số kiểu_dữ_liệu = giá_trị_mặc_định Ví dụ 5.6: Trong câu lệnh đây: CREATE PROC sp_TestDefault( 109 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL @tenlop NVARCHAR(30)=NULL, @noisinh NVARCHAR(100)='Huế') AS BEGIN IF @tenlop IS NULL SELECT hodem,ten FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE noisinh=@noisinh ELSE SELECT hodem,ten FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE noisinh=@noisinh AND tenlop=@tenlop END thủ tục sp_TestDefault định nghĩa với tham số @tenlop có giá trị mặc định NULL tham số @noisinh có giá trị mặc định Huế Với thủ tục định nghĩa trên, ta thực lời gọi với mục đích khác sau: • Cho biết họ tên sinh viên sinh Huế: sp_testdefault • Cho biết họ tên sinh viên lớp Tin K24 sinh Huế: sp_testdefault @tenlop='Tin K24' • Cho biết họ tên sinh viên sinh Nghệ An: sp_testDefault @noisinh=N'Nghệ An' • Cho biết họ tên sinh viên lớp Tin K26 sinh Đà Nẵng: sp_testdefault @tenlop='Tin K26',@noisinh='Đà Nẵng' 5.1.7 Sửa đổi thủ tục Khi thủ tục tạo ra, ta tiến hành định nghĩa lại thủ tục câu lệnh ALTER PROCEDURE có cú pháp sau: ALTER PROCEDURE tên_thủ_tục [(danh_sách_tham_số)] [WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS Các_câu_lệnh_Của_thủ_tục 110 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL Câu lệnh sử dụng tương tự câu lệnh CREATE PROCEDURE Việc sửa đổi lại thủ tục có khơng làm thay đổi đến quyền cấp phát thủ tục không tác động đến thủ tục khác hay trigger phụ thuộc vào thủ tục 5.1.8 Xoá thủ tục Để xố thủ tục có, ta sử dụng câu lệnh DROP PROCEDURE với cú pháp sau: DROP PROCEDURE tên_thủ_tục Khi xoá thủ tục, tất quyền cấp cho người sử dụng thủ tục đồng thời bị xố bỏ Do đó, tạo lại thủ tục, ta phải tiến hành cấp phát lại quyền thủ tục 5.2 Hàm người dùng định nghĩa Hàm đối tượng sở liệu tương tự thủ tục Điểm khác biệt hàm thủ tục hàm trả giá trị thơng qua tên hàm cịn thủ tục khơng Điều cho phép ta sử dụng hàm thành phần biêu thức (chẳng hạn danh sách chọn câu lệnh SELECT) Ngoài hàm hệ quản trị sở liệu cung cấp sẵn, người sử dụng định nghĩa thêm hàm nhằm phục vụ cho mục đích riêng 5.2.1 Định nghĩa sử dụng hàm Hàm định nghĩa thông qua câu lệnh CREATE FUNCTION với cú pháp sau: CREATE FUNCTION tên_hàm ([danh_sách_tham_số]) RETURNS (kiểu_trả_về_của_hàm) AS BEGIN các_câu_lệnh_của_hàm END Ví dụ 5.7: Câu lệnh định nghĩa hàm tính ngày tuần (thứ tuần) giá trị kiểu ngày CREATE FUNCTION thu(@ngay DATETIME) RETURNS NVARCHAR(10) AS BEGIN 111 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL DECLARE @st NVARCHAR(10) SELECT @st=CASE DATEPART(DW,@ngay) WHEN THEN 'Chu nhật' WHEN THEN 'Thứ hai' WHEN THEN 'Thứ ba' WHEN THEN 'Thứ tư' WHEN THEN 'Thứ năm' WHEN THEN 'Thứ sáu' ELSE 'Thứ bảy' END RETURN (@st) /* Trị trả hàm */ END Một hàm định nghĩa sử dụng hàm hệ quản trị sở liệu cung cấp (thông thường trước tên hàm ta phải định thêm tên người sở hữu hàm) Ví dụ 5.8: Câu lệnh SELECT sử dụng hàm định nghĩa ví dụ trước: SELECT masv,hodem,ten,dbo.thu(ngaysinh),ngaysinh FROM sinhvien WHERE malop=’C24102’ có kết là: 5.2.2 Hàm với giá trị trả “dữ liệu kiểu bảng” Ta biết chức tiện lợi việc sử dụng khung nhìn sở liệu Tuy nhiên, cần phải sử dụng tham số khung nhìn (chẳng hạn tham số mệnh đề WHERE câu lệnh SELECT) ta lại khơng thể thực Điều phần làm giảm tính linh hoạt việc sử dụng khung nhìn 112 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL Ví dụ 5.9: Xét khung nhìn định nghĩa sau: CREATE VIEW sinhvien_k25 AS SELECT masv,hodem,ten,ngaysinh FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE khoa=25 với khung nhìn trên, thơng qua câu lệnh: SELECT * FROM sinhvien_K25 ta biết danh sách sinh viên khoá 25 cách dễ dàng rõ ràng thông qua khung nhìn để biết danh sách sinh viên khố khác khơng thể sử dụng điều kiện có dạng KHOA = @thamso mệnh đề WHERE câu lệnh SELECT Nhược điểm khung nhìn khắc phục cách sử dụng hàm với giá trị trả dạng bảng gọi hàm nội tuyến (inline function) Việc sử dụng hàm loại cung cấp khả khung nhìn cho phép sử dụng tham số nhờ tính linh hoạt cao Một hàm nội tuyến định nghĩa câu lệnh CREATE TABLE với cú pháp sau: CREATE FUNCTION tên_hàm ([danh_sách_tham_số]) RETURNS TABLE AS RETURN (câu_lệnh_select) Cú pháp hàm nội tuyến phải tuân theo qui tắc sau: • Kiểu trả hàm phải định mệnh đề RETURNS TABLE • Trong phần thân hàm có câu lệnh RETURN xác định giá trị trả hàm thông qua câu lệnh SELECT Ngồi ra, khơng sử dụng câu lệnh khác phần thân hàm Ví dụ 5.10: Ta định nghĩa hàm func_XemSV sau: CREATE FUNCTION func_XemSV(@khoa SMALLINT) RETURNS TABLE AS 113 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL • Thơng qua trigger, ta tạo kiểm tra mối quan hệ phức tạp bảng sở liệu mà thân ràng buộc thực 5.3.1 Định nghĩa trigger Một trigger đối tượng gắn liền với bảng tự động kích hoạt xảy giao tác làm thay đổi liệu bảng Định nghĩa trigger bao gồm yếu tố sau: • Trigger áp dụng bảng nào? • Trigger kích hoạt câu lệnh thực thi bảng: INSERT, UPDATE, DELETE? • Trigger làm kích hoạt? Câu lệnh CREATE TRIGGER sử dụng để đinh nghĩa trigger có cú pháp sau: CREATE TRIGGER tên_trigger ON tên_bảng FOR {[INSERT][,][UPDATE][,][DELETE]} AS [IF UPDATE(tên_cột) [AND UPDATE(tên_cột)|OR UPDATE(tên_cột)] ] các_câu_lệnh_của_trigger Ví dụ 5.12: Ta định nghĩa bảng sau: Bảng MATHANG lưu trữ liệu mặt hàng: CREATE TABLE mathang ( mahang NVARCHAR(5) PRIMARY KEY, /*mã hàng*/ tenhang NVARCHAR(50) NOT NULL, /*tên hàng*/ soluong INT, /*số lượng hàng có*/ ) Bảng NHATKYBANHANG lưu trữ thông tin lần bán hàng CREATE TABLE nhatkybanhang ( stt INT IDENTITY PRIMARY KEY, DATETIME, /*ngày bán hàng*/ 117 Khoa CNTT - Trường ĐHKH Huế nguoimua mahang soluong giaban ) Giáo trình SQL NVARCHAR(30), /*tên người mua hàng*/ NVARCHAR(5) /*mã mặt hàng bán*/ FOREIGN KEY REFERENCES mathang(mahang), INT, /*giá bán hàng*/ MONEY /*số lượng hàng bán*/ Câu lệnh định nghĩa trigger trg_nhatkybanhang_insert Trigger có chức tự động giảm số lượng hàng có mặt hàng bán (tức câu lệnh INSERT thực thi bảng NHATKYBANHANG) CREATE TRIGGER trg_nhatkybanhang_insert ON nhatkybanhang FOR INSERT AS UPDATE mathang SET mathang.soluong=mathang.soluong-inserted.soluong FROM mathang INNER JOIN inserted ON mathang.mahang=inserted.mahang Với trigger vừa tạo trên, liệu bảng MATHANG là: sau ta thực câu lênh: INSERT INTO nhatkybanhang (ngay,nguoimua,mahang,soluong,giaban) VALUES('5/5/2004','Tran Ngoc Thanh','H1',10,5200) liệu bảng MATHANG sau: Trong câu lệnh CREATE TRIGGER ví dụ trên, sau mệnh đề ON tên bảng mà trigger cần tạo tác động đến Mệnh đề định câu lệnh kích hoạt trigger (FOR INSERT) Ngồi INSERT, ta cịn định UPDATE DELETE cho mệnh đề này, kết hợp chúng lại với Phần thân trigger nằm sau từ khoá AS bao gồm câu lệnh mà trigger thực thi kích hoạt 118 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL Chuẩn SQL định nghĩa hai bảng logic INSERTED DELETED để sử dụng trigger Cấu trúc hai bảng tương tự cấu trúc bảng mà trigger tác động Dữ liệu hai bảng tuỳ thuộc vào câu lệnh tác động lên bảng làm kích hoạt trigger; cụ thể trường hợp sau: • Khi câu lệnh DELETE thực thi bảng, dòng liệu bị xoá chép vào bảng DELETED Bảng INSERTED trường hợp khơng có liệu • Dữ liệu bảng INSERTED dịng liệu bổ sung vào bảng gây nên kích hoạt trigger câu lệnh INSERT Bảng DELETED trường hợp khơng có liệu • Khi câu lệnh UPDATE thực thi bảng, dòng liệu cũ chịu tác động câu lệnh chép vào bảng DELETED, bảng INSERTED dòng sau cập nhật 5.3.2 Sử dụng mệnh đề IF UPDATE trigger Thay định trigger kích hoạt bảng, ta định trigger kích hoạt thực thao tác cụ thể việc thay đổi liệu liên quan đến số cột định cột Trong trường hợp này, ta sử dụng mệnh đề IF UPDATE trigger IF UPDATE không sử dụng câu lệnh DELETE Ví dụ 5.13: Xét lại ví dụ với hai bảng MATHANG NHATKYBANHANG, trigger kích hoạt ta tiến hành cập nhật cột SOLUONG cho ghi bảng NHATKYBANHANG (lưu ý cập nhật ghi) CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang FOR UPDATE AS IF UPDATE(soluong) UPDATE mathang SET mathang.soluong = mathang.soluong – (inserted.soluong-deleted.soluong) FROM (deleted INNER JOIN inserted ON deleted.stt = inserted.stt) INNER JOIN mathang ON mathang.mahang = deleted.mahang Với trigger ví dụ trên, câu lệnh: UPDATE nhatkybanhang SET soluong=soluong+20 WHERE stt=1 119 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL kích hoạt trigger ứng với mệnh đề IF UPDATE (soluong) câu lệnh UPDATE trigger thực thi Tuy nhiên câu lệnh: UPDATE nhatkybanhang SET nguoimua='Mai Hữu Tồn' WHERE stt=3 lại khơng kích hoạt trigger Mệnh đề IF UPDATE xuất nhiều lần phần thân trigger Khi đó, mệnh đề IF UPDATE phần câu lệnh mệnh đề thực thi trigger kích hoạt Ví dụ 5.14: Giả sử ta định nghĩa bảng R sau: CREATE TABLE R ( A INT, B INT, C INT ) trigger trg_R_update cho bảng R: CREATE TRIGGER trg_R_test ON R FOR UPDATE AS IF UPDATE(A) Print 'A updated' IF UPDATE(C) Print 'C updated' Câu lệnh: UPDATE R SET A=100 WHERE A=1 kích hoạt trigger cho kết là: A updated câu lệnh: UPDATE R SET C=100 WHERE C=2 kích hoạt trigger cho kết là: C updated câu lệnh: UPDATE R SET B=100 WHERE B=3 hiển nhiên khơng kích hoạt trigger 120 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL 5.3.3 ROLLBACK TRANSACTION trigger Một trigger có khả nhận biết thay đổi mặt liệu bảng liệu, từ phát huỷ bỏ thao tác khơng đảm bảo tính tồn vẹn liệu Trong trigger, để huỷ bỏ tác dụng câu lệnh làm kích hoạt trigger, ta sử dụng câu lệnh(1): ROLLBACK TRANSACTION Ví dụ 5.15: Nếu bảng MATHANG, ta tạo trigger sau: CREATE TRIGGER trg_mathang_delete ON mathang FOR DELETE AS ROLLBACK TRANSACTION Thì câu lệnh DELETE khơng thể có tác dụng bảng MATHANG Hay nói cách khác, ta khơng thể xố liệu bảng Ví dụ 5.16: Trigger kích hoạt câu lệnh INSERT sử dụng để bổ sung ghi cho bảng NHATKYBANHANG Trong trigger kiểm tra điều kiện hợp lệ liệu số lượng hàng bán phải nhỏ số lượng hàng có Nếu điều kiện khơng thoả mãn huỷ bỏ thao tác bổ sung liệu CREATE TRIGGER trg_nhatkybanhang_insert ON NHATKYBANHANG FOR INSERT AS DECLARE @sl_co int /* Số lượng hàng có */ DECLARE @sl_ban int /* Số lượng hàng bán */ DECLARE @mahang nvarchar(5) /* Mã hàng bán */ SELECT @mahang=mahang,@sl_ban=soluong FROM inserted SELECT @sl_co = soluong FROM mathang where mahang=@mahang /*Nếu số lượng hàng có nhỏ số lượng bán huỷ bỏ thao tác bổ sung liệu */ (1) Cách sử dụng ý nghĩa câu lệnh ROLLBACK TRANSACTION bàn luận chi tiết chương 121 Khoa CNTT - Trường ĐHKH Huế Giáo trình SQL IF @sl_co