Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 32 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
32
Dung lượng
1,29 MB
Nội dung
9/18/2015 CHƯƠNG 5: THỦ TỤC LƯU TRỮ, HÀM VÀ TRIGGER Trường Đại học Khoa học Tự nhiên Khoa Công nghệ Thông tin Bộ môn Hệ thống Thông tin NỘI DUNG Thủ tục lưu trữ (stored procedure) Hàm người dùng định nghĩa Trigger 9/18/2015 Thủ tục lưu trữ (stored procedure) 1.1 Các khái niệm 1.2 Tạo thủ tục lưu trữ 1.3 Lời gọi thủ tục lưu trữ 1.4 Sử dụng biến thủ tục 1.5 Giá trị trả tham số thủ tục lưu trữ 1.6 Tham số với giá trị mặc định 1.7 Sửa đổi thủ tục 1.8 Xoá thủ tục 1.1 Các khái niệm • SQL thiết kế cài đặt ngôn ngữ để thực thao tác 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 9/18/2015 1.1 Các khái niệm • 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 1.1 Các khái niệm • 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 – 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 9/18/2015 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ố 1.2 Tạo thủ tục lưu trữ • Trong (tt): – RECOMPILE: 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 – ENCRYPTION: Thủ tục mã hoá tuỳ chọn WITH ENCRYPTION định Nếu thủ tục mã hố, ta khơng thể 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 9/18/2015 1.2 Tạo thủ tục lưu trữ • 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ị TI005, cột MASV nhận giá trị mã sinh viên học lớp có mã C24105 cột điểm NULL) 1.2 Tạo thủ tục lưu trữ • Nếu thực 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' 10 9/18/2015 1.2 Tạo thủ tục lưu trữ • 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 PROCEDURE 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) SELECT @mamonhoc,masv FROM sinhvien WHERE malop=@malop 11 END 1.2 Tạo thủ tục lưu trữ • 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' 12 9/18/2015 1.3 Lời gọi thủ tục lưu trữ • 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 tuân 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ị 13 1.3 Lời gọi thủ tục lưu 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='TI005', @sodvht=5 14 9/18/2015 1.4 Sử dụng biến thủ tục • Ngồ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 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 15 1.4 Sử dụng biến thủ tục • Ví dụ 5.3: Trong định nghĩa thủ tục sử dụng biến chứa giá trị truy xuất từ sở liệu 16 9/18/2015 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(@aINT,@b INT, @c INT) AS SELECT @c = @a + @b • 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 SELECT @tong=0 EXECUTE sp_Conghaiso 100,200,@tong SELECT @tong • Câu lệnh “SELECT @tong” cho kết là: 17 1.5 Giá trị trả tham số thủ tục lưu trữ • 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 kiểu_dữ_liệu OUT • hoặc: @tên_tham_số • 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) 18 9/18/2015 1.5 Giá trị trả tham số thủ tục lưu trữ • Ví dụ 5.5: Ta định nghĩa lại thủ tục ví dụ 5.4 sau: CREATE PROCEDURE sp_Conghaiso (@a INT, @b INT, @c 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 19 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 20 10 9/18/2015 2.2 Hàm với giá trị trả “dữ liệu kiểu bảng” • Đối với hàm nội tuyến, phần thân hàm cho phép xuất câu lệnh RETURN Trong trường hợp cần phải sử dụng đến nhiều câu lệnh phần thân hàm, ta sử dụng cú pháp sau để định nghĩa hàm: CREATE FUNCTION tên_hàm([danh_sách_tham_số]) RETURNS @biến_bảng TABLE định_nghĩa_bảng AS BEGIN các_câu_lệnh_trong_thân_hàm RETURN END 35 2.2 Hàm với giá trị trả “dữ liệu kiểu bảng” • Khi định nghĩa hàm dạng cần lưu ý số điểm sau: – Cấu trúc bảng trả hàm xác định dựa vào định nghĩa bảng mệnh đề RETURNS Biến @biến_bảng mệnh đề RETURNS có phạm vi sử dụng hàm sử dụng tên bảng – Câu lệnh RETURN thân hàm không định giá trị trả Giá trị trả hàm dịng liệu bảng có tên @biếnbảng định nghĩa mệnh đề RETURNS • Cũng tương tự hàm nội tuyến, dạng hàm sử dụng câu lệnh SQL với vai trò bảng hay khung nhìn 36 18 9/18/2015 • Ví dụ 5.11: Ta định nghĩa hàm func_TongSV sau: 37 2.2 Hàm với giá trị trả “dữ liệu kiểu bảng” • Với hàm định nghĩa trên, câu lệnh: SELECT * FROM dbo.func_TongSV(25) • Sẽ cho kết thống kê tổng số sinh viên khoá 25 khoa: 38 19 9/18/2015 2.2 Hàm với giá trị trả “dữ liệu kiểu bảng” • Câu lệnh: SELECT * FROM dbo.func_TongSV(0) • Cho ta biết tổng số sinh viên có (tất khố) khoa: 39 Trigger 3.1 Định nghĩa trigger 3.2 Sử dụng mệnh đề IF UPDATE trigger 3.3 ROLLBACK TRANSACTION trigger 3.4 Sử dụng trigger trường hợp câu lệnh INSERT, UPDATE DELETE có tác động đến nhiều dịng liệu 40 20 9/18/2015 Trigger • Ta biết ràng buộc sử dụng để đảm bảo tính tồn vẹn liệu sở liệu • Một đối tượng khác thường sử dụng sở liệu với mục đích trigger • Cũng tương tự thủ tục lưu trữ, trigger đối tượng chứa tập câu lệnh SQL tập câu lệnh thực thi trigger gọi • Điểm khác biệt thủ tục lưu trữ trigger là: thủ tục lưu trữ thực thi người sử dụng có lời gọi đến chúng trigger lại “gọi” tự động xảy giao tác làm thay đổi liệu bảng • Mỗi trigger tạo gắn liền với bảng sở liệu Khi liệu bảng bị thay đổi trigger tự đơng kích hoạt 41 Trigger • Các trigger thực hữu dụng với khả sau: – Một trigger nhận biết, ngăn chặn huỷ bỏ thao tác làm thay đổi trái phép liệu sở liệu – Các thao tác liệu (xoá, cập nhật bổ sung) trigger phát tự động thực loạt thao tác khác sở liệu nhằm đảm bảo tính hợp lệ liệu – 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 42 21 9/18/2015 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? 43 3.1 Định nghĩa trigger • Câu lệnh CREATE TRIGGER sử dụng để định 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 44 22 9/18/2015 3.1 Định nghĩ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) tenhang NVARCHAR(50) soluong INT, ) PRIMARY KEY, /*mã hàng*/ NOT NULL, /*tên hàng*/ /*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*/ nguoimua NVARCHAR(30), /*tên người mua hàng*/ mahang NVARCHAR(5) /*mã mặt hàng bán*/ FOREIGN KEY REFERENCES mathang(mahang), soluong INT, /*số lượng hàng bán*/ giaban MONEY /*giá bán hàng*/ 45 ) 3.1 Định nghĩa trigger • Câu lệnh sau đị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 46 23 9/18/2015 3.1 Định nghĩa trigger • Với trigger vừa tạo, 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: 47 3.1 Định nghĩa trigger • 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ị xố 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 48 24 9/18/2015 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) 49 3.2 Sử dụng mệnh đề IF UPDATE trigger 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 50 25 9/18/2015 3.2 Sử dụng mệnh đề IF UPDATE trigger • Với trigger ví dụ trên, câu lệnh: UPDATE nhatkybanhang SET soluong=soluong+20 WHERE stt=1 • 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 51 3.2 Sử dụng mệnh đề IF UPDATE 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 trigger trg_R_update cho bảng R sau: 52 26 9/18/2015 3.2 Sử dụng mệnh đề IF UPDATE trigger • 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ịn câu lệnh: UPDATE R SET B=100 WHERE B=3 • hiển nhiên khơng kích hoạt trigger 53 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 (ta khơng thể xố liệu bảng) 54 27 9/18/2015 3.3 ROLLBACK TRANSACTION trigger • 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 55 56 28 9/18/2015 3.4 Sử dụng trigger trường hợp câu lệnh INSERT, UPDATE DELETE có tác động đến nhiều dịng liệu • Trong ví dụ trước, trigger thực hoạt động mục đích câu lệnh kích hoạt trigger có tác dụng dịng liệu • Ta nhận thấy câu lệnh UPDATE DELETE thường có tác dụng nhiều dịng, câu lệnh INSERT rơi vào trường hợp khơng phải khơng gặp; ta sử dụng câu lệnh có dạng INSERT INTO SELECT Vậy làm để trigger hoạt động trường hợp câu lệnh có tác động lên nhiều dịng liệu? • Có hai giải pháp sử dụng vấn đề này: – Sử dụng truy vấn – Sử dụng biến trỏ 57 3.4.1 Sử dụng truy vấn • Ví dụ 5.17: Ta xét lại trường hợp hai bảng MATHANG NHATKYBANHANG sơ đồ đây: 58 29 9/18/2015 3.4.1 Sử dụng truy vấn • Trigger cập nhật lại số lượng hàng bảng MATHANG câu lệnh UPDATE sử dụng để cập nhật cột SOLUONG bảng NHATKYBANHANG 59 3.4.1 Sử dụng truy vấn • Với trigger định nghĩa trên, thực câu lệnh: UPDATE nhatkybanhang SET soluong = soluong + 10 WHERE stt = • liệu bảng MATHANG NHATKYBANHANG là: 60 30 9/18/2015 3.4.1 Sử dụng truy vấn • Nếu thực tiếp câu lệnh: UPDATE nhatkybanhang SET soluong=soluong + WHERE mahang= 'H2' • liệu hai bảng sau câu lệnh thực xong sau: Giá trị phải 35 61 3.4.1 Sử dụng truy vấn • Để khắc phục lỗi gặp phải trên, ta định nghĩa lại trigger sau: 62 31 9/18/2015 3.4.2 Sử dụng biến trỏ 63 32 ...9/18/20 15 Thủ tục lưu trữ (stored procedure) 1.1 Các khái niệm 1.2 Tạo thủ tục lưu trữ 1.3 Lời gọi thủ tục lưu trữ 1.4 Sử dụng biến thủ tục 1 .5 Giá trị trả tham số thủ tục lưu trữ 1.6 Tham... mục đích trigger • Cũng tương tự thủ tục lưu trữ, trigger đối tượng chứa tập câu lệnh SQL tập câu lệnh thực thi trigger gọi • Điểm khác biệt thủ tục lưu trữ trigger là: thủ tục lưu trữ thực thi... 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) 18 9/18/20 15 1 .5 Giá trị trả tham số thủ tục lưu trữ • Ví dụ 5. 5: Ta định nghĩa lại thủ tục ví dụ 5. 4 sau: