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...

pdf124 trang | Chia sẻ: havih72 | Lượt xem: 85 | Lượt tải: 0download
Nội dung tài liệu Bài giảng Hệ quản trị cơ sở dữ liệu - Chương III: Procedure, function, view, trigger và index, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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:

  • pdfbai_giang_he_quan_tri_co_so_du_lieu_chuong_iii_procedure_fun.pdf