Bài giảng Hệ quản trị cơ sở dữ liệu - Chương III: Procedure, function, view, trigger và index
Tóm tắt Bài giảng Hệ quản trị cơ sở dữ liệu - Chương III: Procedure, function, view, trigger và index: ...ảng. Cú pháp như sau: CREATE FUNCTION func_name (parameter datatype) RETURNS @biên_bng TABLE dnh_nghia_bng AS BEGIN các_câu_lenh_trong_thân_hàm RETURN END Lưu ý: sau từ khóa RETURNS là một biến bảng được định nghĩa và sau từ khóa RETURN cuối hàm không có tham sô nào đi kèm 2.3 Hàm Multi ... I.MaHD= D.MaHD) Begin Rollback Tran Raiserror(‘Số đơn đặt hàng không tồn tại’, 16,1) Return End 4. Trigger 59 --Tính ra ngày đặt hàng Select @NgayDH=NgayDH From HoaDon_DH D, Inserted I Where D.MaHD = I.MaHD -- Kiểm tra ngày giao hàng phải sau ngày đặt hàng IF @NgayDH < (Select ngay...vi hoạt động của biến cursor hoặc là cục bộ (local) bên trong một thủ tục. FORWARD_ONLY: đọc dữ liệu trong cursor theo chiều đi tới duyệt từ mẫu tin đầu tiên đến mẫu tin cuối cùng. Biến kiểu dữ liệu cursor SCROLL: Đọc dữ liệu trong cursor được phép di chuyển tới lui, qua lại các dòng mẫu...
KH) 2.3 Hàm Multi statement table valued 40 Lệnh DROP FUNCTION dùng để xóa hàm DROP FUNCTION func_name DROP FUNCTION f_KhachHang 3. View 41 View là một bảng logic hay ‘bảng ảo’ truy cập đến một hoặc nhiều bảng dữ liệu hoặc view khác. View truy xuât dên các cột và dòng dữ liệu bên trong bảng và hiển thị ra đúng các thông tin tối thiểu mà người sử dụng cần dùng. 3. View 42 Đối với một số view, người dùng có thể thực hiện các thao tác thêm, xóa, sửa dữ lieu. Việc thực hiện các thao tác này Phải thỏa các điều kiện sau: - Trong câu lệnh SELECT định nghĩa view không được sử Dụng các từ khóa DISTINCT, TOP, GROUP BY, UNION - Các thành phần xuất hiện trong danh sách chọn của câu Lệnh SELECT không xuất hiển các biểu thức tính toán, các hàm gộp - Các ràng buộc toàn vẹn trên các bảng cơ sở phải được đảm bảo 3. View 43 Cú pháp tạo view: CREATE VIEW [schema_name.] tên_view [(column[,...n])][WITH ENCRYPTION] AS câu_lenh_select [ ; ] [ WITH CHECK OPTION ] 3. View 44 Tạo view cho biết mã nhân viên, tên nhân viên và tên chức vụ của nhân viên ( phòng ban có mã phòng ban là 45) CREATE VIEW empvu45 AS SELECT MaNV, TenNV, TenCV FROM NhanVien nv, ChucVu cv WHERE nv.MaCV=cv.MaCV and MaPB=45 Truy vấn đến view empvu45: Select * From empvu45 3. View 45 Tạo view cho biết mã nhân viên, họ lót có bí danh là ‘FIRST NAME’, tên nhân viên có bí danh là ‘LAST NAME’ và lương của nhân viên có bí danh là ‘MONTHLY_SALARY’ ( phòng ban có mã phòng ban là 41) CREATE VIEW salvu41 AS SELECT MaNV, HoLot AS ‘FIRST NAME’, TenNV AS ‘LAST NAME’, Luong AS ‘MONTHLY_SALARY’ FROM NhanVien WHERE MaPB=41 3. View 46 Cú pháp xóa view: DROP VIEW [tên_schema.] tên_view Xóa view salvu41: DROP VIEW salvu41 4. Trigger 47 Trigger là một dạng đặc biệt của thủ tục lưu trữ và thực thi tự động khi người dùng áp dụng câu lệnh cập nhật dữ liệu lên một table chỉ định nhằm mục đích đảm bảo tính toàn vẹn dữ liệu. Nếu trigger bị vi phạm, câu lệnh sẽ không được thực thi 4. Trigger 48 Trigger được sử dụng trong các cách sau: Có thể thay đổi đồng loạt các table có liên quan với nhau trong CSDL Có thể không cho phép hoặc hủy bỏ những thay đổi vi phạm ràng buoc toàn vẹn tham chiêu và các giao dịch sửa đổi dữ liệu 4. Trigger 49 Có thể áp đặt các giới hạn phức tạp hơn những giới hạn được định nghĩa bằng ràng buộc CHECK và có thể tham chiếu đến các cột trong các bảng khác Có thể tìm sự khác biệt giữa các trạng thái của một table trước và sau khi sửa đổi dữ liệu và lấy ra những tác động dựa trên sự thay đổi đó 4. Trigger 50 Cơ chế hoạt động của trigger 3 biến cố kích hoạt 1 trigger INSERT UPDATE DELETE Trigger lưu trữ dữ liệu của mẩu tin vừa thêm vào một table mới có tên là INSERTED. Trigger lưu trữ dữ liệu của mẩu tin vừa xoá vào một table có tên là DELETED. Trigger lưu trữ dữ liệu của mẩu tin vừa cập nhật là sự phối hợp của 2 table DELELTED và INSERTED 4. Trigger 51 Cú pháp: CREATE TRIGGER Tên_trigger ON tên_table| tên_view AFTER | INSTEAD OF biến_cố_kích_hoạt_trigger AS -- Các câu lệnh T-SQL Có thể thay bằng FOR. After là mặc định, chỉ định nghĩa duy nhất được trên view 4. Trigger 52 CREATE TRIGGER Them_HH ON HANG_HOA AFTER INSERT AS Select * From Inserted Thêm dữ liệu INSERT HANG_HOA(MaHH, TenHH) VALUES(‘TV01’, ‘Tivi Sony’) 4. Trigger 53 CREATE TRIGGER SUA_HH ON HANG_HOA AFTER UPDATE AS Select * From Inserted Select * From Deleted Cập nhật dữ liệu UPDATE HANG_HOA SET Ten_HH = ‘Man Hinh Sony’ WHERE MaHH = ‘TV01’ 4. Trigger 54 CREATE TRIGGER Xoa_HH ON HANG_HOA AFTER DELETE AS Select * From Inserted Select * From Deleted Xóa dữ liệu DELETE HANG_HOA WHERE MaHH = ‘TV01’ 4. Trigger 55 Các thao tác trigger phổ biến Thêm mới mẩu tin Xóa mẩu tin Sửa mẩu tin 4. Trigger - Thêm mới mẩu tin 56 Kiểm tra ràng buộc dữ liệu Khoá ngoại Miền giá trị Liên bộ trên một quan hệ Liên thuộc tính trong cùng một bảng Liên thuộc tính của nhiều bảng khác nhau 4. Trigger 57 HOADON_DH(MaHD, NgayDH, MaKH) PHIEU_XUAT(MaPX, NgayXuat, #MaHD ) CHITIET_DH(MAHD, MaHH, SoLuong, DonGia) Xây dựng trigger trong bảng PHIEU_XUAT để kiểm tra các ràng buộc toàn vẹn dữ liệu khi người dùng thêm mới thông tin của một phiếu xuất hàng cho một bảng hoá đơn đặt hàng trước đó. Các ràng buộc toàn vẹn dữ liệu bao gồm. Khoá ngoại: cần kiểm tra số đặt hàng phải tồn tại trong bảng đơn đặt hàng. Miền giá trị: cần kiểm tra ngày giao hàng phải ở sau ngày đặt hàng. 4. Trigger 58 CREATE TRIGGER tg_PhieuXuat_Insert ON PHIEU_XUAT FOR INSERT AS DECLARE @NgayHD datetime, @ErrMsg varchar(200) -- Kiểm tra số hoá đơn đã có trong bảng DONDH không? IF NOT EXISTS(Select * From Inserted I, HOADON_DH D Where I.MaHD= D.MaHD) Begin Rollback Tran Raiserror(‘Số đơn đặt hàng không tồn tại’, 16,1) Return End 4. Trigger 59 --Tính ra ngày đặt hàng Select @NgayDH=NgayDH From HoaDon_DH D, Inserted I Where D.MaHD = I.MaHD -- Kiểm tra ngày giao hàng phải sau ngày đặt hàng IF @NgayDH < (Select ngayxuat From Inserted) Begin Set @ErrMsg = ‘ngày giao hàng phải ở sau ngày:’ + Convert(char(10), ngayDH, 103 ) Raierror(@ErrMsg,16,1) Rollback tran End 4. Trigger 60 Kiểm tra ràng buộc Kiểm tra ràng buộc khóa ngoại Ví dụ: khi xoá một số hoá đơn đặt hàng trong bảng HOADON_DH cần phải kiểm tra các RBTV dữ liệu sau: Kiểm tra xem đơn đặt hàng bị xoá đã được xuất hàng chưa? Nếu đã được xuất rồi thì thông báo không thể xoá đơn đặt hàng được. Ngược lại thì xoá dữ liệu liên quan bên bảng chi tiết đơn đặt hàng (CHITIET_HD) 4. Trigger 61 CREATE TRIGGER tg_HOADON_Delete ON HOADON_DH FOR DELETE AS DECLARE @SoPX char(5), @ErrMsg char(200), @Delete_Err int -- Kiểm tra xem đơn hàng đã được xuất chưa IF EXISTS(Select MaPX From PHIEU_XUAT Where MaHD IN(Select MaHD From Deleted)) Begin Select @MaPX = MaPX From PHIEU_XUAT Where MaHD In(Select MaHD From Deleted) Set @ErrMsg = ‘Đơn đặt hàng đã được nhập theo ’+ ‘số xuất hàng ’+ @SoPX + char(13) + ‘.Không thể huỷ được’ RaiseError(@ErrMsg,16,1) Rollback tran End 4. Trigger 62 Else Begin -- Xoá tự động chi tiết các đơn đặt hàng liên quan Delete FROM CHITIET_DH Where MaHD In(Select MaHD From DELETED) Set @Delete_Err = @@ERROR IF @Delete_Err 0 Begin Set @ErrMsg = ‘Lỗi vi phạm xóa trên bảng chi tiết đặt hàng’ RaisError(@ErrMsg, 16, 1) Rollback Tran End End 4. Trigger - Sửa đổi mẩu tin 63 Kiểm tra ràng buộc dữ liệu Khoá ngoại Miền giá trị Liên bộ trên một quan hệ Liên thuộc tính trong cùng một bảng Liên thuộc tính của nhiều bảng khác nhau 4. Trigger 64 Hàm Update Ý nghĩa kiểm tra dữ liệu của cột bên trong bảng có bị thay đổi trong các trigger sửa đổi dữ liệu Cú pháp UPDATE (tên_cột) (biểu thức luận lý) Tên_cột: tên cột mà chúng ta muốn kiểm tra xem dữ liệu tại đó có bị sửa đổi trong trigger không. Biểu thức luận lý: trả về True khi giá trị dữ liệu của cột đã bị sửa đổi, ngược lại trả về False khi giá trị dữ liệu của cột không bị sửa đổi 4. Trigger 65 Sửa đổi thông tin của một số đặt hàng bên trong bảng HOADON_DH cần phải kiểm tra các ràng buộc toàn vẹn dữ liệu sau: Không cho phép sửa đổi dữ liệu tại cột MaDH hoặc MaKH vì khi đó dữ liệu sẽ ảnh hưởng đến nhiều bảng. Sửa đổi giá trị cột ngày đặt hàng thì phải đảm bảo luôn luôn trước ngày giao hàng đầu tiên của số đặt hàng đó (nếu đơn đặt hàng đã có giao hàng). 4. Trigger 66 CREATE TRIGGER tg_HOADON_DH_Update ON HOADON_DH FOR UPDATE AS Declare @MinNgayXH date, @ErrMsg varchar(200) -- Khi sửa đổi các cột MaDH hoặc MaKH IF Update(MaDH) OR Update(MaKH) Begin Rollback Tran Set @ErrMsg = ‘Không thể thay đổi số đặt hàng hoặc mã khách hàng’ RaisError(@ErrMsg, 16, 1) Return End 4. Trigger 67 -- Khi sửa đổi ngày đặt hàng IF Update(NgayDH) Begin -- Kiểm tra đơn đặt hàng đã được xuất chưa IF EXISTS (Select MaPX From PHIEU_XUAT PX, Deleted d where px.madh=d.madh Begin -- Tính ra ngày nhập hàng đầu tiên Select @MinNgayXH = Min(NgayXuat) From PHIEU_XUAT PX, DELETED D Where PX.MaDH = D.MaDH 4. Trigger 68 --kiểm tra giá trị ngày đăt hàng sau khi sửa đổi --phải luôn trước ngày giao hàng đầu tiên IF @MinNgayXH < (Select NgayDH From Inserted) Begin Rollback tran Set @ErrMsg = ‘Ngày đặt hàng phải ở trước ngày:’ + Convert(char(10), @MinNgayXH, 103) RaisError(@ErrMsg, 16, 1) End End End 4. Trigger 69 Cài đặt trigger ngăn chặn tạo login ở cấp độ server IF EXISTS (SELECT * FROM sys.server_triggers WHERE name = ‘rtg_KhongTaoLoginMoi') DROP TRIGGER rtg_KhongTaoLoginMoi ON ALL SERVER GO CREATE TRIGGER rtg_KhongTaoLoginMoi ON ALL SERVER FOR CREATE_LOGIN AS PRINT N'Phi DROP trigger rtg_KhongTaoLoginMoi trưc khi to account' rollback 4. Trigger 70 Cho phép (enable) hoặc vô hiệu hóa (disable) trigger: ENABLE | DISABLE TRIGGER trigger_name ON {OBJECT | DATABASE | SERVER} Vô hieu hóa trigger rtg_KhongTaoLoginMoi: disable trigger rtg_KhongTaoLoginMoi Cho phép trigger rtg_KhongTaoLoginMoi hoạt động trở lại: enable trigger rtg_KhongTaoLoginMoi 4. Trigger 71 Hiển thị thông tin vê các triggger: Tất cả các đối tượng trong CSDL được liệt kê trong bảng hệ thống sysobjects. Cột type trong sysobjects xác định các trigger với chữ viết tắt là TR SELECT * FROM sysobjects WHERE type=‘TR’ 4. Trigger 72 Cú pháp hiển thị thông tin về triggger: sp_help tên_trigger Hiển thị thông tin trigger tgr_test: Sp_help tgr_test 4. Trigger 73 Câu lệnh Create triggger của mỗi trigger được lưu trữ trong bảng hệ thống syscomments. Người dùng có thể hiển thị nội dung câu lệnh trigger bằng cách sử dụng thủ tục sp_helptext Hiển thị nội dung trigger tgr_test: Sp_helptext tgr_test Biến kiểu dữ liệu cursor CSDL quan hệ thường làm việc trên dữ liệu có nhiều dòng mẫu tin – còn gọi là các bộ mẫu tin. Ví dụ lệnh SELECT kết quả luôn trả về nhiều dòng dữ liệu hơn là một dòng dữ liệu. Tuy nhiên có một số ngôn ngữ lập trình việc xử lý và tính toán dữ liệu trên từng dòng riêng lẻ. Để đáp ứng được yêu cầu này SQL Server tạo ra một kiểu dữ liệu đó chính là kiểu cursor. Biến kiểu dữ liệu cursor Biến kiểu dữ liệu cursor Các bước sử dụng kiểu dữ liệu cursor Định nghĩa biến kiểu cursor bằng lệnh DECLARE. Sử dụng lệnh OPEN để mở ra cursor đã định nghĩa trước đó. Đọc và xử lý trên từng dòng dữ liệu bên trong cursor. Đóng cursor bằng lệnh CLOSE và DEALLOCATE. Biến kiểu dữ liệu cursor Cú pháp định nghĩa biến có kiểu cursor DECLARE Tên_cursor CURSOR [LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL] [STATIC | DYNAMIC | KEYSET] [READ_ONLY | SCROLL_LOCK] FOR Câu_lệnh SELECT [FOR UPDATE [OF danh_sách_cột_n]] Biến kiểu dữ liệu cursor Trong đó: Tên cursor: tên của biến kiểu cursor Từ khoá LOCAL | GLOBAL: dùng chỉ phạm vi hoạt động của biến cursor hoặc là cục bộ (local) bên trong một thủ tục. FORWARD_ONLY: đọc dữ liệu trong cursor theo chiều đi tới duyệt từ mẫu tin đầu tiên đến mẫu tin cuối cùng. Biến kiểu dữ liệu cursor SCROLL: Đọc dữ liệu trong cursor được phép di chuyển tới lui, qua lại các dòng mẫu tin bên trong cursor tùy thích. Biến kiểu dữ liệu cursor STATIC: Đọc dữ liệu bên trong cursor tĩnh. Khi đó nếu những người dùng khác có thay đổi bên dưới dữ liệu gốc thì các thay đổi đó sẽ không được cập nhật tự động trong dữ liệu của cursor. Bởi vì khi đó dữ liệu trong cursor chính là dữ liệu của bảng tạm đã được hệ thống sao chép và lưu trữ trong CSDL tempdb của hệ thống khi định nghĩa cursor. Biến kiểu dữ liệu cursor DYNAMIC: dùng chỉ định dữ liệu trong cursor là động. Khi đó việc cập nhật dữ liệu trong bảng cơ sở bởi những người dùng khác sẽ được cập nhật tự động trong dữ liệu cursor có kiểu là DYNAMIC. Biến kiểu dữ liệu cursor KEYSET: hoạt động giống với kiểu DYNAMIC, các thay đổi dữ liệu trên các cột không là khóa chính trong bảng cơ sở bởi những người dùng khác sẽ được cập nhật trong dữ liệu cursor. Tuy nhiên đối với mẫu tin vừa thêm mới hoặc các mẫu tin đã bị hủy bỏ bởi những người dùng khác sẽ không được hiển thị trong dữ liệu cursor có kiểu là KEYSET. Biến kiểu dữ liệu cursor READ_ONLY: chỉ định dữ liệu trong cursor chỉ đọc nhằm hạn chế việc sửa đổi dữ liệu bên trong cursor. Khi khai báo cursor với kiểu dữ liệu tĩnh (STATIC) thì dữ liệu trong cursor xem như chỉ đọc. Biến kiểu dữ liệu cursor SCROLL_LOCK: chỉ định hệ thống SQL Server tự động khóa các dòng mẫu tin cần phải thay đổi giá trị hoặc hủy bỏ bên trong bảng nhằm bảo đảm các hành động cập nhật luôn thành công. Biến kiểu dữ liệu cursor SELECT: dùng để chỉ đến các cột bên trong bảng mà chúng ta cần đọc dữ liệu. Danh sách các cột cập nhật: chỉ định danh sách tên các cột sẽ được phép thay đổi giá trị trong cursor. Biến kiểu dữ liệu cursor Ví dụ 1: để định nghĩa một biến cursor chứa toàn bộ các dòng dữ liệu bên trong bảng SV, các dòng dữ liệu trong cursor cho phép được cập nhật. Declare C_SV cursor dynamic For select * From SV Biến kiểu dữ liệu cursor Ví dụ 2: Định nghĩa một biến cursor chứa toàn bộ các dòng dữ liệu bên trong bảng MH, các dữ liệu trong cursor chỉ được phép đọc và việc đọc dữ liệu trong cursor chỉ theo một chiều đi tới. Declare C_MH cursor forward_only static Read_only For select * From MH Biến kiểu dữ liệu cursor Mở Cursor Cú pháp: OPEN Tên_cursor Trong đó: Tên cursor: tên của biến cursor đã được định nghĩa trước đó bằng lệnh DECLARE Biến kiểu dữ liệu cursor Ví dụ: Mở các cursor đã định nghĩa ở ví dụ 1 trên. Chúng ta sử dụng lệnh OPEN như sau: OPEN C_SV Biến kiểu dữ liệu cursor Đọc và xử lý dữ liệu trong cursor FETCH [Next | Prior | First | Last | Absolute n | Relative n ] FROM Tên_cursor [INTO danh_sách_biến] Biến kiểu dữ liệu cursor Trong đó: Next, Prior, First, Last: dùng để đọc dữ liệu kế tiếp, trước,đầu, sau cùng. Absolute: dữ liệu chính xác thứ n trong cursor. N>0 chỉ định việc đọc dữ liệu tại dòng thứ n đếm từ dòng đầu tiên, n<0 dùng chỉ định việc đọc dữ liệu tại dòng thứ n được đếm ngược từ dòng cuối trở lên. Biến kiểu dữ liệu cursor Trong đó: Relative: dùng chỉ định việc đọc dữ liệu tại một dòng tương đối so với dòng dữ liệu hiện hành. N là một số nguyên có thể dương có thể âm để chỉ định theo chiều tới hoặc lui so với dòng dữ liệu hiện hành. Biến kiểu dữ liệu cursor Tên_cursor: tên của biến cursor đã định nghĩa trước đó bằng lệnh DECLARE. Danh sách biến: danh sách tên các biến cục bộ đã được định nghĩa trước đó. Các biến này sẽ lưu trữ các giá trị dữ liệu được đọc từ lệnh FETCH. Biến kiểu dữ liệu cursor Biến kiểu dữ liệu cursor Đóng cursor Cú pháp: CLOSE Tên_cursor DEALLOCATE Tên_cursor Biến kiểu dữ liệu cursor Trong đó CLOSE giải phóng các dòng dữ liệu tham chiếu bên trong cursor. Lệnh DEALLOCATE giải phóng thật sự biến cursor ra khỏi bộ nhớ Biến kiểu dữ liệu cursor SQL Server cung cấp một biến hệ thống @@FETCH_STATUS dùng để kiểm tra trình trạng đọc dữ liệu thành công hay thất bại. Giá trị trả về 0 khi việc đọc dữ liệu là thành công. Biến kiểu dữ liệu cursor Cho lược đồ quan hệ như sau: MAT_HG (MaMH,TenMH, DVT, MaNCC) Pnhap (MaPN, NgayNhap,ThanhTien) CTPNhap (MaMH, MaPN, SLNhap, DonGia) Biến kiểu dữ liệu cursor Ví dụ 1: Đọc dữ liệu cursor của bảng MAT_HANG chỉ đọc các vật tư làTivi Biến kiểu dữ liệu cursor -- Khai báo biến cursor declare cr_MatHang cursor keyset FOR SELECT * FROM MAT_HANG WHERE MaMH like ‘TV%’ ORDER BY MaMH -- Mở cursor OPEN cr_MatHang Biến kiểu dữ liệu cursor -- Đọc dữ liệu FETCH NEXT FROM cr_MatHang WHILE @@FETCH_STATUS = 0 BEGIN -- Đọc tiếp dòng kế FETCH NEXT FROM cur_MatHang END Biến kiểu dữ liệu cursor -- Đóng cursor CLOSE cr_MatHang DEALLOCATE cr_MatHang Biến kiểu dữ liệu cursor Ví dụ 2: Đọc dữ liệu cursor của bảng SV chỉ đọc các sinh viên có họ bắt đầu là L. Biến kiểu dữ liệu cursor Khai báo biến cursor Declare cr_sv cursor keyset For select * from SV Where tensv like ‘L%' Order by masv Mở cursor OPEN cr_SV Biến kiểu dữ liệu cursor Đọc dữ liệu Fetch next from cr_sv While @@fetch_status =0 Begin -- Đọc tiếp dòng kế FETCH NEXT FROM cr_SV END Biến kiểu dữ liệu cursor Đóng cursor CLOSE cr_SV DEALLOCATE cr_SV Biến kiểu dữ liệu cursor Ví dụ 3: Cập nhật dữ liệu cho cột ThanhTien trong bảng PNHAP bằng cách duyệt qua từng phiếu nhập, tính ra trị giá nhập của từng phiếu căn cứ vào số lượng nhập và đơn giá nhập của từng vật tư trong bảng CTPNHAP, sau cùng cập nhật vào cột ThanhTien. Biến kiểu dữ liệu cursor -- Khai báo biến cursor, các biến cục bộ declare @Sopn char(4), @TongTT Money DECLARE cr_Pnhap CURSOR FORWARD_ONLY FOR SELECT MAPN FROM PNHAP Biến kiểu dữ liệu cursor -- Mở cursor OPEN cr_Pnhap Biến kiểu dữ liệu cursor -- Đọc dữ liệu và cập nhật giá trị fetch next from cr_Pnhap into @Sopn while @@fetch_status = 0 begin select @Tongtt = sum(SLNhap*dongia) from ctpnhap where mapn = @sopn Print ‘dang cap nhat phieu nhap: ’ + @SoPN update pnhap set Thanhtien = @TongTT Where Current OF cr_Pnhap// mapn=@SOPN -- dịch con trỏ đến dòng kế tiếp fetch next from cr_Pnhap into @Sopn end Dịch chuyển con trỏ cr_Pnhap vào @SoPN Biến kiểu dữ liệu cursor --Đóng cursor CLOSE cr_Pnhap DEALLOCATE cr_Pnhap Biến kiểu dữ liệu cursor -- Khai báo biến cursor, các biến cục bộ declare @sopn char(4), @tongtt money declare cr_pnhap cursor forward_only for select mapn from pnhap -- Mở cursor Open cr_Pnhap Biến kiểu dữ liệu cursor --Đọc dữ liệu và cập nhật giá trị while (0 = 0) begin fetch next from cur_pnhap into @sopn if @@fetch_status0 Break Select @Tongtg = Sum(SLNhap*dongia) From Ctpnhap where mapn = @sopn Print ‘dang cap nhat phieu nhap: ’ + @sopn Update Pnhap Set Thanhtien = @TongTT where current of cr_pnhap end Biến kiểu dữ liệu cursor --Đóng cursor CLOSE cr_Pnhap DEALLOCATE cr_Pnhap Biến kiểu dữ liệu cursor DECLARE Tên_cursor CURSOR {kiểu đọc | cập nhật dữ liệu} FOR Câu lệnh SELECT -- Mở cursor OPEN Tên_cursor Biến kiểu dữ liệu cursor --Đọc dữ liệu và cập nhật giá trị WHILE (0=0) Begin FETCH NEXT FROM [INTO danh_sách_biến] IF @@FETCH_STATUS 0 Break End Biến kiểu dữ liệu cursor --Đóng cursor CLOSETên_cursor DEALLOCATETên_cursor Biến kiểu dữ liệu cursor Khi nào chúng ta cần sử dụng kiểu dữ liệu cursor trongTransaction-SQL để giải quyết các vấn đề: SQL Server là một hệ quản trị CSDL quan hệ (Relational Database Management System) do đó chúng ta nên chọn giải pháp làm việc trên các bộ mẫu tin. Biến kiểu dữ liệu cursor Khi cần giải quyết vấn đề cập nhật dữ liệu thì luôn ưu tiên chọn các hướng giải quyết trên bộ mẫu tin bởi vì khi đó làm cho các bộ xử lý được nhanh hơn. Sau cùng là hướng giải quyết theo kiểu cursor là giải pháp sau cùng nhất để chọn lựa khi không còn giải pháp nào tốt hơn Vô hiệu hóa ràng buộc 120 Vô hiệu hóa ràng buộc Alter table nocheck constraint all Cho kích hoạt việc kiểm tra các ràng buộc Alter table check constraint all 5. Index 121 Tạo Index nhằm tăng tốc độ truy xuất dữ liệu. Thông thường, việc tạo index thường trên các thuộc tính PRIMARY KEY, UNIQUE CREATE INDEX tên_index ON tên_bng (tên_cot1(,tên_cot2),) Tạo index tên cột TenNV trong bảng NhanVien: CREATE INDEX NV_idx ON NhanVien (TenNV) 5. Index 122 Nên tạo Index trong các trường hợp sau: Những cột thường dùng trong mệnh đề WHERE để liên kết cột này với các bảng khác Những cột có miền trị lớn và nhiều Những cột có giá trị NULL lớn Đối với các bảng lớn và truy vấn dữ liệu trên bảng trả về kết quả <4% sô dòng trong bảng 5. Index 123 Không nên tạo Index trong các trường hợp sau: Những bảng nhỏ Những cột thường không dùng trong mệnh đề WHERE Những bảng thường xuyên cập nhật dữ liệu 5. Index 124 Cú pháp câu lệnh xóa index DROP INDEX tên_bng.tên_index Xóa index NV_idx: DROP INDEX NhanVien.NV_idx
File đính kèm:
- bai_giang_he_quan_tri_co_so_du_lieu_chuong_iii_procedure_fun.pdf