• Cung cấp thao tác hiệu chỉnh dữ liệu cho các dòng tại vị trí của vị trí của Cursor Cursor trong tập kết quả.. Dynamic Cursor:• Cursor Cursor phản ánh được toàn bộ sự thay đổi của c
Trang 113
Trang 21 Khái niệm:
Cursor 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 quả Sau khi
quả Sau khi cursor cursor được định vị trên một dòng, các hoạt động có thể thực hiện trên dòng đó.
Dùng Cursor để:
• Định vị một dòng đặc biệt trong tập kết quả.
• Truy xuất một hoặc khối dòng bắt đầu từ vị trí cursor trong tập kết quả.
• Cung cấp thao tác hiệu chỉnh dữ liệu cho các dòng tại
vị trí của
vị trí của Cursor Cursor trong tập kết quả.
• Cung cấp các mức độ khác nhau của tính tường minh trong sự thay đổi đước tạo bởi những người
Trang 3Khi sử dụng cursor trong SQL Server:
• Cursor cần phải khai báo và các thuộc tính của
nó cũng cần được xác định
• Mở cursor Mở cursor .
• Phải lấy (fetch Phải lấy ( fetch ) các dòng cần thiết từ cursor ) các dòng cần thiết từ cursor .
• Dữ liệu trong dòng hiện hành có thể được hiệu chỉnh nếu cần thiết.
• Tạm thời không dùng cursor thì phải đóng cursor lại.
• Cursor cần phải được giải phóng khi không cần dùng nữa.
Trang 42 Phân Loại Cursor:
a Static Cursor:
• Tập kết quả của con trỏ loại Static được xây dựng trong
trong tempdb tempdb khi con trỏ được mở.
• Con trỏ không phản ánh được bất kỳ sự thay đổi nào trong database ngay cả khi những dòng dữ liệu có thay đổi.
• Tất cả t hao tác Insert hao tác Insert , Update , Update , Delete , Delete đều không
có tác dụng khi dùng
có tác dụng khi dùng static cursor static cursor
Trang 5b Keyset-driven Cursor:
• Thành viên và thứ tự của các dòng trong một
keyset-driven cursor là cố định khi cursor được
mở Con trỏ được điều khiển bởi một tập giá trị nhận dạng gọi là
nhận dạng gọi là Keyset Keyset Keyset được xây dựng
trong
trong Tempdb Tempdb khi con trỏ được mở.
• Cho phép hiệu chỉnh (update Cho phép hiệu chỉnh ( update , delete , delete ) dữ liệu trên
cột không là keyset (bởi chủ cursor hoặc từ user khác) khi user duyệt thông qua con trỏ.
• Inserts made by other users are not visible.
Trang 6c Dynamic Cursor:
• Cursor Cursor phản ánh được toàn bộ sự thay đổi của
các dòng dữ liệu trong tập kết quả khi duyệt
Cursor
• Giá trị dữ liệu, thứ tự, và thành viên của các dòng trong tập kết quả có thể thay đổi ứng với mỗi lần duyệt con trỏ.
• Tất cả các lệnh Insert, Update, Delete Tất cả các lệnh Insert, Update, Delete của các
user đều hữu hiệu thông qua con trỏ.
d Fast Forward Cursor:
Chỉ duyệt con trỏ theo một chiều từ
Chỉ duyệt con trỏ theo một chiều từ First First Last
Trang 713.2 Làm việc với T-SQL server cursors
Khai báo cursor Bằng câu lệnh declare ở sau từ khóa
AS trong stored procedures hoặc functions
DECLARE cursor_name CURSOR cursor_name CURSOR
Trang 8Ghi chú:
•
• Select_statement: Select_statement: Là câu lệnh truy vấn để định
nghĩa tập kết quả của cursor Từ khóa
COMPUTE , COMPUTE BY , COMPUTE BY , FOR BROWSE,
hiệu chỉnh, nếu không có column list, all columns all columns
có thể update.
Trang 9Mở cursor: Cursor được open sau khai báo
OPEN {cursor_name}
Lấy mẫu tin hoặc điều hướng cursor (FETCH)
FETCH [ [ NEXT | PRIOR | FIRST | LAST |
ABSOLUTE n | REALTIVE n ] ]
FROM cursor_name [ cursor_name [ INTO @variable_name [,…n]] @variable_name [,…n]]
Truy xuất từng dòng dữ liệu Kiểm tra phạm vi con
vòng lặp While While để duyệt cả tập kết quả của Cursor
INTO @variable_name[, n]: Allows data from the
columns of a fetch to be placed into local variables
Trang 10Có thể dùng các câu lệnh Update Có thể dùng các câu lệnh Update hoặc Delete hoặc Delete để hiệu
chỉnh dữ liệu.
Sử dụng dữ liệu của mẫu tin hiện hành: Dữ liệu gán
cho các biến tương ứng trong câu lệnh
cho các biến tương ứng trong câu lệnh Fetch Fetch
Cập nhật dữ liệu thông qua cursor Cập nhật dữ liệu thông qua cursor : Thực chất là dữ liệu được hiệu chỉnh trực tiếp vào trong bảng.
Cập nhật giá trị cho cột
UPDATE <Table_Name>
SET <Column_Name> = <Value> [,…n]
WHERE CURRENT OF <Cur_Name>
Xóa dữ liệu thông qua cursor: Thực sự là dữ liệu xóa
trên bảng
DELETE <Ten Table>
WHERE CURRENT OF OF <Cur_name>
Trang 11DEALLOCATE cursor_name
Trang 12DECLARE contro CURSOR FOR contro CURSOR FOR
Select Select mahang, tenhang, soluong From mahang, tenhang, soluong From mathang
OPEN contro
Declare @mahang Nvarchar(10) @mahang Nvarchar(10)
Declare @tenhang Nvarchar(10) @tenhang Nvarchar(10)
Declare @soluong Int @soluong Int
FETCH NEXT FROM contro
INTO @mahang, @tenhang, @soluong
While
While @@FETCH_STATUS @@FETCH_STATUS = 0
Begin Begin
Print 'Ma hang: '+@mahang
Print 'Ten hang:'+@tenhang
Print 'So luong: '+ Print 'So luong: '+STR STR (@soluong)
FETCH NEXT FROM contro
INTO @mahang, @tenhang, @soluong
End End
CLOSE contro
Trang 13Declare MyCursor CURSOR FOR MyCursor CURSOR FOR
Select c.CustomerId, c.CompanyName, o.OrderID, o.OrderDate From Customers c Inner Join Customers c Inner Join Orders o
ON c.CustomerID = o.CustomerID
FOR UPDATE
OPEN MyCursor
Declare @cid varchar @cid varchar (8), @cn varchar(80), @o int (8), @cn varchar(80), @o int , @od datetime , @od datetime
Select @cid, @cn
Begin TRANSACTION
Update Customers SET Customers SET CompanyName = 'q'
Where Current Of Current Of MyCursor
Deallocate MyCursor
Select * From * From Customers Where Customers Where CompanyName = 'q'
Rollback TRANSACTION
Trang 14TRIGGER14
Trang 15I Khái niệm cơ bản về Trigger:
Cũng tương tự như store procedure Cũng tương tự như store procedure , một Trigger , một Trigger là
một đối tượng chứa một tập các câu lệnh SQL và tập các câu lệnh này sẽ được thực thi khi
các câu lệnh này sẽ được thực thi khi trigger trigger được gọi
Điểm khác biệt giữa store procedure Điểm khác biệt giữa store procedure và trigger và trigger là: các
store procedure được thực thi khi người sử dụng có lời gọi đến chúng còn các
gọi đến chúng còn các trigger trigger lại được “gọi” TỰ ĐỘNG lại được “gọi” TỰ ĐỘNG
khi xảy ra những giao tác làm thay đổi dữ liệu trong các bảng.
Mỗi một trigger Mỗi một trigger được tạo ra và gắn liền với một bảng
nào đó trong cơ sở dữ liệu
nào đó trong cơ sở dữ liệu Khi dữ liệu trong bảng bị Khi dữ liệu trong bảng bị
thay đổi thì trigger sẽ được tự đông kích hoạt.
Trang 16 Dùng trigger một cách hợp lý trong cơ sở dữ liệu sẽ có
tác động rất lớn trong việc tăng hiệu năng của CSDL:
Một trigger có thể nhận biết, ngăn chặn và huỷ bỏ được
những thao tác làm thay đổi trái phép dữ liệu trong cơ
sở dữ liệu
Các thao tác trên dữ liệu ( Delete , Insert , Update ) có thể
được trigger phát hiện ra và tự động thực hiện một loạt các thao tác trên CSDL nhằm đảm bảo tính hợp lệ của
dữ liệu
Thông qua trigger , ta có thể tạo và kiểm tra được
những mối quan hệ phức tạp hơn giữa các bảng trong
cơ sở dữ liệu mà bản thân các ràng buộc không thể thực hiện được
Trang 17[ [IF UPDATE IF UPDATE (tên_cột)
[ [AND UPDATE AND UPDATE (tên_cột) | OR UPDATE (tên_cột) | OR UPDATE (tên_cột)] ]
các_câu_lệnh_của_trigger
Trang 18Create Trigger tg_NhatKyBanHang_insert
On NhatKyBanHang
FOR INSERT
AS
Update MatHang MatHang
Set SoLuong SoLuong = m.SoLuong - i = m.SoLuong - i .SoLuong
From Mathang as Mathang as m Inner Join m Inner Join Inserted Inserted as i i
On m.MaHang = i m.MaHang = i .MaHang
Trang 19 Với trigger vừa tạo ở trên, nếu dữ liệu trong bảng
MatHang là:
Insert Into NhatKyBanBang
(NgayBan, NguoiMua, MaHang, SoLuong, GiaBan)
lênh Insert trên:
Trang 20 Hai bảng logic Inserted và Deleted để sử dụng trong các
trigger Cấu trúc của hai bảng này tương tự như cấu trúc của bảng mà trigger tác động Dữ liệu trong hai bảng này tuỳ thuộc vào câu lệnh tác động lên bảng làm kích hoạt Trigger:
Khi câu lệnh Delete được thực thi trên bảng, các dòng
dữ liệu bị xoá sẽ được sao chép vào trong bảng Deleted Trong trường hợp này
Trong trường hợp này Bảng Inserted không có dữ liệu
Dữ liệu trong bảng Inserted sẽ là dòng dữ liệu được bổ
sung vào bảng gây nên sự kích hoạt đối với trigger bằng câu lệnh Insert Trong trường hợp này Trong trường hợp này Bảng Deleted không có dữ liệu không có dữ liệu
Trang 21 Khi câu lệnh UPDATE được thực thi trên bảng:
Các dòng dữ liệu cũ chịu sự tác động của câu lệnh sẽ
được sao chép vào bảng Deleted
Còn trong bảng Inserted sẽ là các dòng sau khi đã được
cập nhật.
Thay vì chỉ định một trigger được kích hoạt trên một
bảng, ta có thể chỉ định trigger được kích hoạt và thực hiện những thao tác cụ thể khi việc thay đổi dữ liệu chỉ liên quan đến một số cột nhất định nào đó của cột
Trong trường hợp này, ta sử dụng mệnh đề IF
UPDATE trong trigger IF UPDATE không sử dụng được đối với câu lệnh DELETE
Trang 22Xét lại ví dụ với hai bảng MatHang và NhatKyBanHang ,
trigger dưới đây được kích hoạt khi ta tiến hành cập nhật
duy nhất 1 cột Soluong cho bảng NhatKyBanHang
Create Trigger tg_nhatkybanhang_update_soluong
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
Trang 23 Với trigger ở ví dụ trên, câu lệnh:
Update NhatKyNanHang
Set soluong=soluong+20
Where stt=1
Sẽ kích hoạt Trigger ứng với mệnh đề IF UPDATE
(soluong), câu lệnh Update trong trigger sẽ được thực thi.
Tuy nhiên câu lệnh sau không kích hoạt trigger này
Update NhatKyNanHang
Set nguoimua=N'Mai Hữu Toàn'
Where stt=3
Trang 24Bảo mật trong SQL Server
15
Trang 25 Windows Authentication
Mode:
Windows Authentication:
User phải là những User
được Windows quản lý mới
được truy nhập.
Mixed Mode:
Windows and SQL Server
Authentication: User của
Trang 26Role là đối tượng xác định nhóm thuộc tính để gán
quyền cho các user tham gia khai thác SQL Server
Server Role (xem bảng – Giáo trình –Tr.133)
Về cơ bản giống Server Role giống các Group trong
Windwos server
Một thành viên của bất kỳ thành Server Role nào đều
có thể thêm các User khác có trong Sever Role đó
Database Role (xem bảng – Giáo trình –Tr.136)
Các quyền truy xuất CSDL phải được cấp rõ ràng bởi
một system administrator hoặc thành viên của
administrator role trong CSDL
SERVER ROLE và DATABASE ROLE
Trang 27Người dùng trong SQL Server được chia thành 2 mức: Người truy nhập vào SQL Server gọi là
Người truy nhập vào SQL Server gọi là Login Login , người khai thác CSDL gọi là
khai thác CSDL gọi là User User.
User là đối tượng khai thác CSDL, nếu login chỉ xác
định truy nhập vào SQL Server thì
định truy nhập vào SQL Server thì User User là login ID là login ID
tham gia khai thác CSDL.
QUẢN TRỊ NGƯỜI DÙNG
Trang 28sp_addlogin 'login_name' , 'password' , 'database_name'
sp_droplogin 'login_name'
sp_grantdbaccess 'login_name'
sp_revokedbaccess 'login_name'
sp_helprole
sp_addrolemember 'role_name' , ' 'login_name login_name '
sp_droprolemember 'role_name' , ' 'login_name login_name '
sp_helpsrvrole
sp_addsrvrolemember 'login_name ' , 'role_name'
sp_dropsrvrolemember 'login_name 'login_name ' , 'role_name'
Tạo User Gán Role bằng câu lệnh
(Xem thêm giáo trình trang 145-147)
Trang 29Vd1:
sp_addlogin 'admin' , '123456' , 'QLyDiem'
sp_grantdbaccess 'admin'
sp_addrolemember ' db_owner ' , 'admin'
sp_addsrvrolemember 'admin' , ' ' sysadmin'
Tạo User Gán Role bằng câu lệnh
(Xem thêm giáo trình trang 144-147)
Trang 30Database role
Server role
Tạo User và gán Role
cho User bằng Enterprise Manager
xem giáo trình trang 140->144