Cursor là một đối tượng của CSDL mà nó hỗ trợ cho là một đối tượng của CSDL mà nó hỗ trợ cho phép truy xuất và thao tác dữ liệu trong một tập kết.. phép truy xuất và thao tác dữ liệu[r]
(1)CURSOR
CURSOR 13
(2)1 Khái niệm: 1 Khái niệm:
Cursor
Cursor đối tượng CSDL mà hỗ trợ cho đối tượng CSDL mà hỗ trợ cho phép truy xuất thao tác liệu tập kết
phép truy xuất thao tác liệu tập kết
quả Sau
quả Sau cursorcursor định vị dòng, định vị dịng, hoạt động thực dịng đó.
hoạt động thực dịng đó. Dùng Cursor để:
Dùng Cursor để:
•
• Định vị dịng đặc biệt tập kết quả.Định vị dòng đặc biệt tập kết quả. •
• Truy xuất khối dịng vị trí Truy xuất khối dịng vị trí cursor tập kết quả.
cursor tập kết quả.
•
• Cung cấp thao tác hiệu chỉnh liệu cho dòng Cung cấp thao tác hiệu chỉnh liệu cho dòng tại vị trí
tại vị trí Cursor Cursor tập kết quả.trong tập kết quả. •
• Cung cấp mức độ khác tính tường Cung cấp mức độ khác tính tường minh thay đổi đước tạo người
(3)Khi sử dụng cursor SQL Server:
Khi sử dụng cursor SQL Server:
•
• Cursor cần phải khai báo thuộc tính Cursor cần phải khai báo thuộc tính nó cần xác định
nó cần xác định •
• Mở cursorMở cursor.. •
• Phải lấy (fetchPhải lấy (fetch) dòng cần thiết từ cursor) dịng cần thiết từ cursor.. •
• Dữ liệu dịng hành hiệu Dữ liệu dịng hành hiệu chỉnh cần thiết.
chỉnh cần thiết. •
• Tạm thời khơng dùng cursor phải đóng cursor Tạm thời khơng dùng cursor phải đóng cursor lại.
lại. •
• Cursor cần phải giải phóng khơng cần Cursor cần phải giải phóng khơng cần dùng nữa.
(4)2 Phân Loại Cursor:
2 Phân Loại Cursor:
a Static Cursor: a Static Cursor:
•
• Tập kết trỏ loại Static xây dựng Tập kết trỏ loại Static xây dựng trong
trong tempdbtempdb trỏ mở. trỏ mở. •
• Con trỏ khơng phản ánh thay đổi Con trỏ không phản ánh thay đổi nào database dòng nào database dịng
liệu có thay đổi. liệu có thay đổi. •
• Tất tTất thao tác Inserthao tác Insert, Update, Update, Delete, Delete khơng khơng có tác dụng dùng
(5)b Keyset-driven Cursor: b Keyset-driven Cursor:
•
• Thành viên thứ tự dòng Thành viên thứ tự dòng keyset-driven cursor
keyset-driven cursor cố định cursor cố định cursor mở Con trỏ điều khiển tập giá trị mở Con trỏ điều khiển tập giá trị
nhận dạng gọi
nhận dạng gọi KeysetKeyset Keyset xây dựng Keyset xây dựng trong
trong TempdbTempdb trỏ mở. trỏ mở. •
• Cho phép hiệu chỉnh (updateCho phép hiệu chỉnh (update, delete, delete) liệu ) liệu cột không keyset (bởi chủ cursor từ user cột không keyset (bởi chủ cursor từ user
khác) user duyệt thông qua trỏ. khác) user duyệt thơng qua trỏ. •
(6)c Dynamic Cursor: c Dynamic Cursor: •
• CursorCursor phản ánh tồn thay đổi phản ánh toàn thay đổi các dòng liệu tập kết duyệt các dòng liệu tập kết duyệt
Cursor Cursor •
• Giá trị liệu, thứ tự, thành viên Giá trị liệu, thứ tự, thành viên dòng tập kết thay đổi ứng với dịng tập kết thay đổi ứng với
mỗi lần duyệt trỏ. mỗi lần duyệt trỏ. •
• Tất lệnh Insert, Update, DeleteTất lệnh Insert, Update, Delete user hữu hiệu thông qua trỏ.
user hữu hiệu thông qua trỏ. d Fast Forward Cursor:
d Fast Forward Cursor:
Chỉ duyệt trỏ theo chiều từ
(7)13.2 Làm việc với T-SQL server cursors13.2 Làm việc với T-SQL server cursors
Khai báo cursor
Khai báo cursor Bằng câu lệnh declare sau từ khóa Bằng câu lệnh declare sau từ khóa AS stored procedures functions
AS stored procedures functions DECLARE
DECLARE cursor_name CURSOR cursor_name CURSOR
[LOCAL | GLOBAL][LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL][FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC |FAST_FORWARD][STATIC | KEYSET | DYNAMIC |FAST_FORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC][READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
FOR
FOR select_statementselect_statement
(8)
Ghi chú:
Ghi chú:
•
• Select_statement:Select_statement: Là câu lệnh truy vấn để định Là câu lệnh truy vấn để định nghĩa tập kết cursor Từ khóa nghĩa tập kết cursor Từ khóa
COMPUTE
COMPUTE, COMPUTE BY, COMPUTE BY, FOR BROWSE, , FOR BROWSE, and
and INTOINTO không cho phép select_statement khơng cho phép select_statement •
• READ ONLYREAD ONLY khơng cho phép Update không cho phép Update cursor này.
cursor này. •
• UPDATEUPDATE [OF [OF column_name [,…n]]:column_name [,…n]]: Quy định Quy định cột cho phép
cột cho phép updateupdate dùng cursor Nếu dùng cursor Nếu OF column_name
OF column_name [,n…] định rõ ràng [,n…] định rõ ràng chỉ có cột định cho phép chỉ có cột định cho phép
hiệu chỉnh, khơng có column list,
hiệu chỉnh, khơng có column list, all columns all columns có thể update.
(9)Mở cursor: Mở cursor: Cursor open sau khai báoCursor open sau khai báo
OPEN
OPEN {cursor_name}{cursor_name}
Lấy mẫu tin điều hướng cursor (FETCH)Lấy mẫu tin điều hướng cursor (FETCH)
FETCH
FETCH [ [ [ [ NEXT | PRIOR | FIRST | LAST | NEXT | PRIOR | FIRST | LAST | ABSOLUTE
ABSOLUTE n n | REALTIVE | REALTIVE n ]n ] ] ] FROM
FROM cursor_name [ cursor_name [ INTOINTO @variable_name [,…n]]@variable_name [,…n]]
Truy xuất dòng liệu Kiểm tra phạm vi Truy xuất dòng liệu Kiểm tra phạm vi trỏ bằng
trỏ @@Fetch_status@@Fetch_status @@fetch_status:
@@fetch_status: Trả vềTrả trỏ1 trỏ dời qua dời qua LAST
LAST Trả 0Trả phạm vi duyệt trỏ phạm vi duyệt trỏ vòng lặp
vòng lặp WhileWhile để duyệt tập kết Cursor để duyệt tập kết Cursor
INTOINTO @variable_name@variable_name[,[, n n]:]: Allows data from the Allows data from the
columns of a fetch to be placed into local variables
(10)Có thể dùng câu lệnh UpdateCó thể dùng câu lệnh Update Delete Delete để hiệu để hiệu
chỉnh liệu.
chỉnh liệu.
Sử dụng liệu mẫu tin hành: Dữ liệu gán Sử dụng liệu mẫu tin hành: Dữ liệu gán
cho biến tương ứng câu lệnh
cho biến tương ứng câu lệnh FetchFetch
Cập nhật liệu thông qua cursorCập nhật liệu thông qua cursor: Thực chất : Thực chất
liệu hiệu chỉnh trực tiếp vào bảng.
liệu hiệu chỉnh trực tiếp vào bảng. Cập nhật giá trị cho cộtCập nhật giá trị cho cột
UPDATE
UPDATE <Table_Name> <Table_Name>
SET
SET <Column_Name> = <Value> [,…n] <Column_Name> = <Value> [,…n]
WHERE CURRENT OF
WHERE CURRENT OF <Cur_Name> <Cur_Name>
Xóa liệu thơng qua cursor: Thực liệu xóa Xóa liệu thơng qua cursor: Thực liệu xóa trên bảng
trên bảng
DELETE
DELETE <Ten Table> <Ten Table>
WHERE CURRENT
(11)Đóng CursorĐóng Cursor
Kết thúc hành động cursor cho lần mở (open),
Kết thúc hành động cursor cho lần mở (open),
vẫn hữu gặp lệnh Open khác
vẫn hữu gặp lệnh Open khác
hoặc gặp lệnh Close cursor.
hoặc gặp lệnh Close cursor. CLOSE
CLOSE cursor_namecursor_name
Giải phóng CursorGiải phóng Cursor
Giải phóng cursor, hủy bỏ tham chiếu đến trỏ từ
Giải phóng cursor, hủy bỏ tham chiếu đến trỏ từ
session hành Tiến trình làm cho tài nguyên
session hành Tiến trình làm cho tài nguyên
trở trạng thái sẵn sàng truy xuất.
trở trạng thái sẵn sàng truy xuất. DEALLOCATE
(12)DECLARE
DECLARE contro CURSOR FOR contro CURSOR FOR
Select Select mahang, tenhang, soluong Frommahang, tenhang, soluong From mathang mathang
OPEN
OPEN contro contro
Declare
Declare @mahang Nvarchar(10) @mahang Nvarchar(10)
Declare
Declare @tenhang Nvarchar(10) @tenhang Nvarchar(10)
Declare
Declare @soluong Int @soluong Int
FETCH NEXT FROM
FETCH NEXT FROM contro contro
INTO
INTO @mahang, @tenhang, @soluong @mahang, @tenhang, @soluong While
While @@FETCH_STATUS @@FETCH_STATUS = = BeginBegin
Print 'Ma hang: '+@mahang Print 'Ma hang: '+@mahang
Print 'Ten hang:'+@tenhang Print 'Ten hang:'+@tenhang
Print 'So luong: '+STRPrint 'So luong: '+STR(@soluong) (@soluong)
FETCH NEXT FROMFETCH NEXT FROM contro contro
INTOINTO @mahang, @tenhang, @soluong @mahang, @tenhang, @soluong
EndEnd
CLOSE
(13)Declare
Declare MyCursor CURSOR FOR MyCursor CURSOR FOR
Select
Select c.CustomerId, c.CompanyName, o.OrderID, o.OrderDate c.CustomerId, c.CompanyName, o.OrderID, o.OrderDate
From
From Customers c Inner Join Customers c Inner Join Orders o Orders o
ON
ON c.CustomerID = o.CustomerID c.CustomerID = o.CustomerID
FOR UPDATE
FOR UPDATE
OPEN
OPEN MyCursor MyCursor
Declare
Declare @cid varchar @cid varchar (8), @cn varchar(80), @o int (8), @cn varchar(80), @o int, @od datetime, @od datetime FETCH NEXT FROM
FETCH NEXT FROM MyCursor MyCursor
INTO
INTO @cid, @cn, @o, @od@cid, @cn, @o, @od
Select
Select @cid, @cn @cid, @cn
Begin TRANSACTION Begin TRANSACTION
Update
Update Customers SET Customers SET CompanyName = CompanyName = 'q' 'q'
Where
Where Current Of Current Of MyCursor MyCursor
Deallocate
Deallocate MyCursor MyCursor
Select
Select * From * From Customers Where Customers Where CompanyName = CompanyName = 'q' 'q'
(14)TRIGGER
TRIGGER
14
(15)I Khái niệm Trigger:
I Khái niệm Trigger:
Cũng tương tự store procedureCũng tương tự store procedure, Trigger, Trigger
một đối tượng chứa tập câu lệnh SQL tập
một đối tượng chứa tập câu lệnh SQL tập
các câu lệnh thực thi
các câu lệnh thực thi triggertrigger gọi gọi
Điểm khác biệt store procedureĐiểm khác biệt store procedure trigger trigger là: là:
store procedure
store procedure thực thi người sử dụng có lời thực thi người sử dụng có lời gọi đến chúng cịn
gọi đến chúng triggertrigger lại “gọi” TỰ ĐỘNG lại “gọi” TỰ ĐỘNG
khi xảy giao tác làm thay đổi liệu
khi xảy giao tác làm thay đổi liệu
các bảng.
các bảng.
Mỗi triggerMỗi trigger tạo gắn liền với bảng tạo gắn liền với bảng
nào sở liệu
nào sở liệu Khi liệu bảng bị Khi liệu bảng bị
thay đổi trigger tự đơng kích hoạt.
(16) Dùng trigger cách hợp lý sở liệu có Dùng trigger cách hợp lý sở liệu có
tác động lớn việc tăng hiệu CSDL:
tác động lớn việc tăng hiệu CSDL:
Một trigger nhận biết, ngăn chặn huỷ bỏ Một trigger nhận biết, ngăn chặn huỷ bỏ
những thao tác làm thay đổi trái phép liệu
những thao tác làm thay đổi trái phép liệu
sở liệu
sở liệu
Các thao tác liệu (Các thao tác liệu (DeleteDelete, , InsertInsert, , UpdateUpdate) )
được
được triggertrigger phát tự động thực loạt phát tự động thực loạt các thao tác CSDL nhằm đảm bảo tính hợp lệ
các thao tác CSDL nhằm đảm bảo tính hợp lệ
dữ liệu
dữ liệu
Thông qua Thông qua triggertrigger, ta tạo kiểm tra , ta tạo kiểm tra
những mối quan hệ phức tạp bảng
những mối quan hệ phức tạp bảng
cơ sở liệu mà thân ràng buộc
cơ sở liệu mà thân ràng buộc
thực
(17)1 Định nghĩa Trigger:
1 Định nghĩa Trigger:
CREATE TRIGGER
CREATE TRIGGER tên_trigger tên_trigger ON tên_bảng
ON tên_bảng
[
[ WITHWITH ENCRYPTIONENCRYPTION ] ]
FORFOR { [INSERT { [INSERT] [,] [UPDATE] [,] [UPDATE] [,] [DELETE] [,] [DELETE] } ] } AS
AS
[
[IF UPDATEIF UPDATE (tên_cột) (tên_cột) [
[AND UPDATEAND UPDATE (tên_cột) | OR UPDATE (tên_cột) | OR UPDATE (tên_cột)] ] (tên_cột)] ] các_câu_lệnh_của_trigger
(18)Create Trigger
Create Trigger tg_NhatKyBanHang_insert tg_NhatKyBanHang_insert On
On NhatKyBanHangNhatKyBanHang FOR INSERT
FOR INSERT AS
AS
Update
Update MatHangMatHang
Set
Set SoLuong SoLuong = m.SoLuong - i= m.SoLuong - i.SoLuong.SoLuong From
From Mathang as Mathang as m Inner Join m Inner Join InsertedInserted asas ii
On
(19) Với trigger vừa tạo trên, liệu bảng Với trigger vừa tạo trên, liệu bảng MatHang là:
MatHang là:
Insert Into
Insert Into NhatKyBanBang NhatKyBanBang
(NgayBan, NguoiMua, MaHang, SoLuong, GiaBan)
(NgayBan, NguoiMua, MaHang, SoLuong, GiaBan) Values
Values('5/5/2004', N'Trần Ngọc Thanh', 'H1', 10('5/5/2004', N'Trần Ngọc Thanh', 'H1', 10, 5200) , 5200)
Dữ liệu bảng MatHang sau ta thực câu Dữ liệu bảng MatHang sau ta thực câu lênh Insert trên:
(20) Hai Hai bảng logicbảng logic InsertedInserted DeletedDeleted để sử dụng để sử dụng
trigger
trigger Cấu trúc hai bảng tương tự cấu Cấu trúc hai bảng tương tự cấu trúc bảng mà
trúc bảng mà triggertrigger tác động Dữ liệu hai 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
bảng tuỳ thuộc vào câu lệnh tác động lên bảng làm
kích hoạt
kích hoạt Trigger:Trigger:
Khi câu lệnh Khi câu lệnh DeleteDelete thực thi bảng, thực thi bảng, các dòng các dòng
dữ liệu bị xoá chép vào trong
dữ liệu bị xoá chép vào trong bảngbảng DeletedDeleted Trong trường hợp này
Trong trường hợp Bảng InsertedBảng Inserted khơng có liệu.khơng có liệu.
Dữ liệu trongDữ liệu trong bảng Insertedbảng Inserted sẽ dòng liệu bổ sẽ dòng liệu bổ
sung vào bảng gây nên kích hoạt đối với
sung vào bảng gây nên kích hoạt triggertrigger bằng câu lệnh
bằng câu lệnh InsertInsert Trong trường hợp Trong trường hợp này Bảng Bảng Deleted
(21) Khi câu lệnh Khi câu lệnh UPDATEUPDATE thực thi bảng: thực thi bảng:
Các dòng liệu cũ chịu tác động câu lệnh Các dòng liệu cũ chịu tác động câu lệnh
được chép vào bảng
được chép vào bảng DeletedDeleted
Còn bảng Còn bảng InsertedInserted dòng sau dòng sau
cập nhật.
cập nhật.
Thay định Thay định triggertrigger kích hoạt kích hoạt
bảng, ta định
bảng, ta định triggertrigger kích hoạt thực kích hoạt thực hiện thao tác cụ thể việc thay đổi liệu
hiện thao tác cụ thể việc thay đổi liệu chỉ liên quan đến số cột định cột
liên quan đến số cột định cột
Trong trường hợp này, ta sử dụng mệnh đề Trong trường hợp này, ta sử dụng mệnh đề IFIF
UPDATE
UPDATE trigger trigger IF UPDATEIF UPDATE không sử dụng không sử dụng được câu lệnh
(22)Xét lại ví dụ với hai bảng Xét lại ví dụ với hai bảng MatHangMatHang NhatKyBanHangNhatKyBanHang, ,
trigger kích hoạt ta tiến hành cập nhật
trigger kích hoạt ta tiến hành cập nhật
duy nhất
duy cột cột SoluongSoluong cho bảng cho bảng NhatKyBanHangNhatKyBanHang Create Trigger
Create Trigger tg_nhatkybanhang_update_soluong tg_nhatkybanhang_update_soluong
ON NhatKyBanHang
ON NhatKyBanHang
FOR UPDATE FOR UPDATE
AS
AS
IF UPDATE
IF UPDATE(soluong) (soluong)
Update
Update mathang mathang
Set
Set MatHang.soluong = MatHang.soluong - MatHang.soluong = MatHang.soluong -(
(InsertedInserted.soluong - soluong - DeletedDeleted.soluong) soluong)
From
From ( (Deleted Deleted Inner JoinInner Join Inserted Inserted OnOn Deleted
Deleted.stt = stt = InsertedInserted.stt) stt) Inner JoinInner Join MatHang MatHang OnOn
MatHang.MaHang =
(23) Với Với triggertrigger ví dụ trên, câu lệnh: ví dụ trên, câu lệnh:
Update
Update NhatKyNanHang NhatKyNanHang
Set
Set soluong=soluong+20 soluong=soluong+20
Where
Where stt=1 stt=1
Sẽ kích hoạt
Sẽ kích hoạt Trigger Trigger ứng với mệnh đề ứng với mệnh đề IF UPDATEIF UPDATE
(soluong),
(soluong), câu lệnh Update trigger thực thi.câu lệnh Update trigger thực thi.
Tuy nhiên câu lệnh sau khơng kích hoạt Tuy nhiên câu lệnh sau khơng kích hoạt triggertrigger
Update
Update NhatKyNanHang NhatKyNanHang
Set
Set nguoimua=N'Mai Hữu Toàn' nguoimua=N'Mai Hữu Toàn'
Where
(24)Bảo mật SQL Server
Bảo mật SQL Server 15
(25)Windows Authentication Windows Authentication
Mode: Mode:
Windows Authentication:
Windows Authentication:
User phải User User phải User
được Windows quản lý được Windows quản lý
được truy nhập. được truy nhập.
Mixed Mode:Mixed Mode:
Windows and SQL Server
Windows and SQL Server
Authentication:
Authentication: User User Windows SQL Server để Windows SQL Server để
có thể thiết lập để truy có thể thiết lập để truy
nhập SQL Server nhập SQL Server
CHẾ ĐỘ BẢO MẬT – SECURITY MODE
(26)Role đối tượng xác định nhóm thuộc tính để gán
Role đối tượng xác định nhóm thuộc tính để gán
quyền cho user tham gia khai thác SQL Server
quyền cho user tham gia khai thác SQL Server Server Role Server Role (xem bảng – Giáo trình –Tr.133)(xem bảng – Giáo trình –Tr.133)
Về giống Server Role giống Group Về giống Server Role giống Group
Windwos server
Windwos server
Một thành viên thành Server Role Một thành viên thành Server Role
có thể thêm User khác có Sever Role đó
có thể thêm User khác có Sever Role đó Database Role Database Role (xem bảng – Giáo trình –Tr.136)(xem bảng – Giáo trình –Tr.136)
Các quyền truy xuất CSDL phải cấp rõ ràng Các quyền truy xuất CSDL phải cấp rõ ràng
một system administrator thành viên
một system administrator thành viên
administrator role CSDL
administrator role CSDL
SERVER ROLE DATABASE ROLE
(27)Người dùng SQL Server chia thành mức:
Người dùng SQL Server chia thành mức:
Người truy nhập vào SQL Server gọi
Người truy nhập vào SQL Server gọi LoginLogin, người , người khai thác CSDL gọi
khai thác CSDL gọi User.User. Mức Login:
Mức Login:
Là đối tượng quyền truy nhập vào SQL Server,
Là đối tượng quyền truy nhập vào SQL Server,
tùy theo chế độ bảo mật SQL Server mà
tùy theo chế độ bảo mật SQL Server mà
login account Windows NT hay SQL Server.
login account Windows NT hay SQL Server. Mức User:
Mức User:
User đối tượng khai thác CSDL, login xác
User đối tượng khai thác CSDL, login xác
định truy nhập vào SQL Server
định truy nhập vào SQL Server UserUser login ID login ID
tham gia khai thác CSDL.
tham gia khai thác CSDL.
QUẢN TRỊ NGƯỜI DÙNG
(28)sp_addlogin
sp_addlogin ''login_namelogin_name' , 'password' , 'database_name' ' , 'password' , 'database_name'
sp_droplogin
sp_droplogin ''login_namelogin_name' '
sp_grantdbaccess
sp_grantdbaccess ''login_namelogin_name' '
sp_revokedbaccess
sp_revokedbaccess ''login_namelogin_name' '
sp_helprole sp_helprole
sp_addrolemember
sp_addrolemember ' 'role_namerole_name' , ' , 'login_name'login_name' '
sp_droprolemember
sp_droprolemember ' 'role_namerole_name' , ' , 'login_name'login_name' '
sp_helpsrvrole sp_helpsrvrole
sp_addsrvrolemember
sp_addsrvrolemember 'login_name'login_name ' , ' , ''role_namerole_name' '
sp_dropsrvrolemember
sp_dropsrvrolemember 'login_name'login_name ' , ' , ''role_namerole_name' '
Tạo User Gán Role câu lệnh Tạo User Gán Role câu lệnh
(29)Vd
Vd1: 1:
sp_addlogin
sp_addlogin ''admin' , '123456' , 'QLyDiem' admin' , '123456' , 'QLyDiem' sp_grantdbaccess
sp_grantdbaccess 'admin' 'admin' sp_addrolemember
sp_addrolemember ' 'db_ownerdb_owner' , 'admin' ' , 'admin' sp_addsrvrolemember
sp_addsrvrolemember 'admin' ,'admin' , ' 'sysadminsysadmin' '
Tạo User Gán Role câu lệnh Tạo User Gán Role câu lệnh
(30)Database role Database role
Server role Server role