Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (419.81 KB, 30 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
<b>1. Khái niệm:</b>
<b>1. Khái niệm:</b>
<b>Cursor</b>
<b>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 </b>
<b>phép truy xuất và thao tác dữ liệu trong một tập kết </b>
<b>phép truy xuất và thao tác dữ liệu trong một tập kết </b>
<b>quả. Sau khi </b>
<b>quả. Sau khi cursorcursor được định vị trên một dòng, các được định vị trên một dòng, các </b>
<b>hoạt động có thể thực hiện trên dịng đó.</b>
<b>hoạt động có thể thực hiện trên dịng đó.</b>
<b>Dùng Cursor để:</b>
<b>Dùng Cursor để:</b>
<b>•</b>
<b>•</b> <b>Định vị một dịng đặc biệt trong tập kết quả.Định vị một dịng đặc biệt trong tập kết quả.</b>
<b>•</b>
<b>•</b> <b>Truy xuất một hoặc khối dòng bắt đầu từ vị trí Truy xuất một hoặc khối dòng bắt đầu từ vị trí </b>
<b>cursor trong tập kết quả.</b>
<b>•</b>
<b>•</b> <b>Cung cấp thao tác hiệu chỉnh dữ liệu cho các dòng Cung cấp thao tác hiệu chỉnh dữ liệu cho các dịng </b>
<b>tại vị trí của </b>
<b>tại vị trí của Cursor Cursor trong tập kết quả.trong tập kết quả.</b>
<b>•</b>
<b>•</b> <b>Cung cấp các mức độ khác nhau của tính tường Cung cấp các mức độ khác nhau của tính tường </b>
<b>minh trong sự thay đổi đước tạo bởi những người </b>
<b><sub>13.2 Làm việc với T-SQL server cursors</sub><sub>13.2 Làm việc với T-SQL server cursors</sub></b>
<b>Khai báo cursor</b>
<b>Khai báo cursor</b> <b>Bằng câu lệnh declare ở sau từ khóa Bằng câu lệnh declare ở sau từ khóa </b>
<b>AS trong stored procedures hoặc functions</b>
<b>AS trong stored procedures hoặc functions</b>
<b>DECLARE</b>
<b>DECLARE cursor_name CURSOR cursor_name CURSOR</b>
<b> </b>
<b> [LOCAL | GLOBAL][LOCAL | GLOBAL]</b>
<b> </b>
<b> [FORWARD_ONLY | SCROLL][FORWARD_ONLY | SCROLL]</b>
<b> [STATIC | KEYSET | DYNAMIC |FAST_FORWARD][STATIC | KEYSET | DYNAMIC |FAST_FORWARD]</b>
<b> </b>
<b> [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC][READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]</b>
<b>FOR</b>
<b>FOR</b> <b>select_statementselect_statement</b>
<b> </b>
<b><sub>Mở cursor: </sub><sub>Mở cursor: </sub><sub>Cursor được open sau khai báo</sub><sub>Cursor được open sau khai báo</sub></b>
<b>OPEN</b>
<b>OPEN</b> <b>{cursor_name}{cursor_name}</b>
<b><sub>Lấy mẫu tin hoặc điều hướng cursor (FETCH)</sub><sub>Lấy mẫu tin hoặc điều hướng cursor (FETCH)</sub></b>
<b>FETCH</b>
<b>FETCH [ [ [ [ NEXT | PRIOR | FIRST | LAST | NEXT | PRIOR | FIRST | LAST | </b>
<b>ABSOLUTE </b>
<b>ABSOLUTE n n | REALTIVE | REALTIVE n ]n ] ] ]</b>
<b>FROM </b>
<b>FROM cursor_name [ cursor_name [ INTOINTO</b> <b>@variable_name [,…n]]@variable_name [,…n]]</b>
<b><sub>Truy xuất từng dòng dữ liệu. Kiểm tra phạm vi con </sub><sub>Truy xuất từng dòng dữ liệu. Kiểm tra phạm vi con </sub></b>
<b>trỏ bằng</b>
<b>trỏ bằng @@Fetch_status@@Fetch_status</b>
<b>@@fetch_status: </b>
<b>@@fetch_status: </b> <b>Trả vềTrả về 1 con trỏ1 con trỏ đã được dời qua đã được dời qua </b>
<b>LAST. </b>
<b>LAST. Trả về 0Trả về 0 vẫn còn trong phạm vi duyệt con trỏ. vẫn còn trong phạm vi duyệt con trỏ. </b>
<b>vòng lặp </b>
<b>vòng lặp WhileWhile để duyệt cả tập kết quả của Cursor để duyệt cả tập kết quả của Cursor</b>
<b><sub>INTO</sub><sub>INTO</sub></b> <i><b><sub>@variable_name</sub></b><b><sub>@variable_name</sub></b></i><b><sub>[,</sub><sub>[,</sub></b><i><b><sub>...n</sub></b><b><sub>...n</sub></b></i><b><sub>]:</sub><sub>]:</sub></b> <b><sub>Allows data from the </sub><sub>Allows data from the </sub></b>
<b>columns of a fetch to be placed into local variables</b>
<b><sub>Có thể dùng các câu lệnh Update</sub><sub>Có thể dùng các câu lệnh </sub><sub>Update</sub><sub> hoặc Delete</sub><sub> hoặc </sub><sub>Delete</sub><sub> để hiệu </sub><sub> để hiệu </sub></b>
<b>chỉnh dữ liệu.</b>
<b>chỉnh dữ liệu.</b>
<b><sub>Sử dụng dữ liệu của mẫu tin hiện hành: Dữ liệu gán </sub><sub>Sử dụng dữ liệu của mẫu tin hiện hành: Dữ liệu gán </sub></b>
<b>cho các biến tương ứng trong câu lệnh </b>
<b>cho các biến tương ứng trong câu lệnh FetchFetch</b>
<b><sub>Cập nhật dữ liệu thông qua cursor</sub><sub>Cập nhật dữ liệu thông qua </sub><sub>cursor</sub><sub>: Thực chất là dữ </sub><sub>: Thực chất là dữ </sub></b>
<b>liệu được hiệu chỉnh trực tiếp vào trong bảng.</b>
<b>liệu được hiệu chỉnh trực tiếp vào trong bảng.</b>
<b><sub>Cập nhật giá trị cho cột</sub><sub>Cập nhật giá trị cho cột</sub></b>
<b>UPDATE</b>
<b>UPDATE <Table_Name> <Table_Name></b>
<b>SET</b>
<b>SET <Column_Name> = <Value> [,…n] <Column_Name> = <Value> [,…n]</b>
<b>WHERE CURRENT OF</b>
<b>WHERE CURRENT OF <Cur_Name> <Cur_Name></b>
<b><sub>Xóa dữ liệu thơng qua cursor: Thực sự là dữ liệu xóa </sub><sub>Xóa dữ liệu thơng qua cursor: Thực sự là dữ liệu xóa </sub></b>
<b>trên bảng</b>
<b>DELETE</b>
<b>DELETE <Ten Table> <Ten Table></b>
<b>WHERE CURRENT</b>
<b><sub>Đóng Cursor</sub><sub>Đóng Cursor</sub></b>
<b>Kết thúc hành động của cursor cho lần mở (open), nó </b>
<b>Kết thúc hành động của cursor cho lần mở (open), nó </b>
<b>vẫn hiện hữu cho đến khi gặp một lệnh Open khác </b>
<b>vẫn hiện hữu cho đến khi gặp một lệnh Open khác </b>
<b>hoặc gặp lệnh Close cursor.</b>
<b>hoặc gặp lệnh Close cursor.</b>
<b>CLOSE </b>
<b>CLOSE cursor_namecursor_name</b>
<b><sub>Giải phóng Cursor</sub><sub>Giải phóng Cursor</sub></b>
<b>Giải phóng cursor, hủy bỏ tham chiếu đến con trỏ từ </b>
<b>Giải phóng cursor, hủy bỏ tham chiếu đến con trỏ từ </b>
<b>session hiện hành. Tiến trình này làm cho tài nguyên </b>
<b>session hiện hành. Tiến trình này làm cho tài nguyên </b>
<b>trở về trạng thái sẵn sàng truy xuất.</b>
<b>trở về trạng thái sẵn sàng truy xuất.</b>
<b>DEALLOCATE</b>
<b>DECLARE</b>
<b>DECLARE contro CURSOR FOR contro CURSOR FOR</b>
<b> Select Select mahang, tenhang, soluong Frommahang, tenhang, soluong From</b> <b>mathang mathang </b>
<b>OPEN</b>
<b>OPEN contro contro </b>
<b>Declare</b>
<b>Declare @mahang Nvarchar(10) @mahang Nvarchar(10) </b>
<b>Declare</b>
<b>Declare @tenhang Nvarchar(10) @tenhang Nvarchar(10)</b>
<b>Declare</b>
<b>Declare @soluong Int @soluong Int</b>
<b>FETCH NEXT FROM</b>
<b>FETCH NEXT FROM contro contro </b>
<b>INTO </b>
<b>INTO @mahang, @tenhang, @soluong @mahang, @tenhang, @soluong </b>
<b>While </b>
<b>While @@FETCH_STATUS @@FETCH_STATUS = 0 = 0 </b>
<b> BeginBegin</b>
<b> </b>
<b> Print 'Ma hang: '+@mahang Print 'Ma hang: '+@mahang </b>
<b> </b>
<b> Print 'Ten hang:'+@tenhang Print 'Ten hang:'+@tenhang </b>
<b> </b>
<b> Print 'So luong: '+STRPrint 'So luong: '+STR(@soluong) (@soluong) </b>
<b> </b>
<b> FETCH NEXT FROMFETCH NEXT FROM contro contro </b>
<b> </b>
<b> INTOINTO @mahang, @tenhang, @soluong @mahang, @tenhang, @soluong </b>
<b> EndEnd</b>
<b>CLOSE</b>
<b>Declare</b>
<b>Declare MyCursor CURSOR FOR MyCursor CURSOR FOR</b>
<b>Select</b>
<b>Select c.CustomerId, c.CompanyName, o.OrderID, o.OrderDate c.CustomerId, c.CompanyName, o.OrderID, o.OrderDate</b>
<b>From</b>
<b>From Customers c Inner Join Customers c Inner Join Orders o Orders o </b>
<b>ON</b>
<b>ON c.CustomerID = o.CustomerID c.CustomerID = o.CustomerID</b>
<b>FOR UPDATE</b>
<b>FOR UPDATE</b>
<b>OPEN</b>
<b>OPEN MyCursor MyCursor</b>
<b>Declare</b>
<b>Declare @cid varchar @cid varchar (8), @cn varchar(80), @o int (8), @cn varchar(80), @o int, @od datetime, @od datetime</b>
<b>FETCH NEXT FROM</b>
<b>FETCH NEXT FROM MyCursor MyCursor </b>
<b>INTO </b>
<b>INTO @cid, @cn, @o, @od@cid, @cn, @o, @od</b>
<b>Select</b>
<b>Select @cid, @cn @cid, @cn</b>
<b>Begin TRANSACTION</b>
<b>Begin TRANSACTION</b>
<b>Update</b>
<b>Update Customers SET Customers SET CompanyName = CompanyName = 'q' 'q' </b>
<b>Where</b>
<b>Where Current Of Current Of MyCursor MyCursor</b>
<b>Deallocate</b>
<b>Deallocate MyCursor MyCursor</b>
<b>Select</b>
<b>Select * From * From Customers Where Customers Where CompanyName = CompanyName = 'q' 'q' </b>
<b>I. Khái niệm cơ bản về Trigger:</b>
<b>I. Khái niệm cơ bản về Trigger:</b>
<b><sub>Cũng tương tự như store procedure</sub><sub>Cũng tương tự như </sub></b> <b><sub>store procedure</sub><sub>, một Trigger</sub><sub>, một </sub></b> <b><sub>Trigger</sub><sub> là </sub><sub> là </sub></b>
<b>một đối tượng chứa một tập các câu lệnh SQL và tập </b>
<b>một đối tượng chứa một tập các câu lệnh SQL và tập </b>
<b>các câu lệnh này sẽ được thực thi khi </b>
<b>các câu lệnh này sẽ được thực thi khi triggertrigger được gọi. được gọi. </b>
<b><sub>Điểm khác biệt giữa store procedure</sub><sub>Điểm khác biệt giữa </sub><sub>store procedure</sub><sub> và trigger</sub><sub> và </sub><sub>trigger</sub><sub> là: các </sub><sub> là: các </sub></b>
<b>store procedure</b>
<b>store procedure được thực thi khi người sử dụng có lời được thực thi khi người sử dụng có lời </b>
<b>gọi đến chúng cịn các </b>
<b>gọi đến chúng còn các triggertrigger lại được “gọi” TỰ ĐỘNG lại được “gọi” TỰ ĐỘNG</b>
<b>khi xảy ra những giao tác làm thay đổi dữ liệu trong </b>
<b>khi xảy ra những giao tác làm thay đổi dữ liệu trong </b>
<b>các bảng.</b>
<b>các bảng.</b>
<b><sub>Mỗi một trigger</sub><sub>Mỗi một </sub><sub>trigger</sub><sub> được tạo ra và gắn liền với một bảng </sub><sub> được tạo ra và gắn liền với một bảng </sub></b>
<b>nào đó trong cơ sở dữ liệu. </b>
<b>nào đó trong cơ sở dữ liệu. Khi dữ liệu trong bảng bị Khi dữ liệu trong bảng bị </b>
<b>thay đổi thì trigger sẽ được tự đơng kích hoạt.</b>
<b><sub>Dùng trigger một cách hợp lý trong cơ sở dữ liệu sẽ có </sub><sub>Dùng trigger một cách hợp lý trong cơ sở dữ liệu sẽ có </sub></b>
<b>tác động rất lớn trong việc tăng hiệu năng của CSDL:</b>
<b>tác động rất lớn trong việc tăng hiệu năng của CSDL:</b>
<b><sub>Một trigger có thể nhận biết, ngăn chặn và huỷ bỏ được </sub><sub>Một trigger có thể nhận biết, ngăn chặn và huỷ bỏ được </sub></b>
<b>những thao tác làm thay đổi trái phép dữ liệu trong cơ </b>
<b>những thao tác làm thay đổi trái phép dữ liệu trong cơ </b>
<b>sở dữ liệu. </b>
<b>sở dữ liệu. </b>
<b><sub>Các thao tác trên dữ liệu (</sub><sub>Các thao tác trên dữ liệu (</sub><sub>Delete</sub><sub>Delete</sub><sub>, </sub><sub>, </sub><sub>Insert</sub><sub>Insert</sub><sub>, </sub><sub>, </sub><sub>Update</sub><sub>Update</sub><sub>) có thể </sub><sub>) có thể </sub></b>
<b>được </b>
<b>được triggertrigger phát hiện ra và tự động thực hiện một loạt phát hiện ra và tự động thực hiện một loạt </b>
<b>các thao tác trên CSDL nhằm đảm bảo tính hợp lệ của </b>
<b>các thao tác trên CSDL nhằm đảm bảo tính hợp lệ của </b>
<b>dữ liệu</b>
<b>dữ liệu</b>
<b><sub>Thông qua </sub><sub>Thông qua </sub></b> <b><sub>trigger</sub><sub>trigger</sub><sub>, ta có thể tạo và kiểm tra được </sub><sub>, ta có thể tạo và kiểm tra được </sub></b>
<b>những mối quan hệ phức tạp hơn giữa các bảng trong </b>
<b>những mối quan hệ phức tạp hơn giữa các bảng trong </b>
<b>cơ sở dữ liệu mà bản thân các ràng buộc không thể </b>
<b>cơ sở dữ liệu mà bản thân các ràng buộc không thể </b>
<b>thực hiện được. </b>
<b>1. Định nghĩa Trigger:</b>
<b>1. Định nghĩa Trigger:</b>
<b>CREATE TRIGGER</b>
<b>CREATE TRIGGER tên_trigger tên_trigger </b>
<b>ON tên_bảng </b>
<b>ON tên_bảng </b>
<b>[ </b>
<b>[ WITHWITH ENCRYPTIONENCRYPTION ] ] </b>
<b> </b>
<b> FORFOR { [INSERT { [INSERT] [,] [UPDATE] [,] [UPDATE] [,] [DELETE] [,] [DELETE] } ] } </b>
<b>AS </b>
<b>AS </b>
<b>[</b>
<b>[IF UPDATEIF UPDATE (tên_cột) (tên_cột) </b>
<b>[</b>
<b>[AND UPDATEAND UPDATE (tên_cột) | OR UPDATE (tên_cột) | OR UPDATE (tên_cột)] ...] (tên_cột)] ...] </b>
<b>các_câu_lệnh_của_trigger </b>
<b>Create Trigger</b>
<b>Create Trigger tg_NhatKyBanHang_insert tg_NhatKyBanHang_insert </b>
<b>On </b>
<b>On NhatKyBanHangNhatKyBanHang</b>
<b>FOR INSERT</b>
<b>FOR INSERT</b>
<b>AS </b>
<b>AS </b>
<b>Update</b>
<b>Update MatHangMatHang</b>
<b>Set</b>
<b>Set SoLuong SoLuong = m.SoLuong - i= m.SoLuong - i.SoLuong.SoLuong</b>
<b>From</b>
<b>From Mathang as Mathang as m Inner Join m Inner Join InsertedInserted</b> <b>asas ii</b>
<b>On</b>
<b><sub>Với trigger vừa tạo ở trên, nếu dữ liệu trong bảng </sub><sub>Với trigger vừa tạo ở trên, nếu dữ liệu trong bảng </sub></b>
<b>MatHang là: </b>
<b>MatHang là: </b>
<b>Insert Into</b>
<b>Insert Into NhatKyBanBang NhatKyBanBang </b>
<b>(NgayBan, NguoiMua, MaHang, SoLuong, GiaBan) </b>
<b>(NgayBan, NguoiMua, MaHang, SoLuong, GiaBan) </b>
<b>Values</b>
<b>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) </b>
<b><sub>Dữ liệu trong bảng MatHang sau khi ta thực hiện câu </sub><sub>Dữ liệu trong bảng MatHang sau khi ta thực hiện câu </sub></b>
<b>lênh Insert trên: </b>
<b><sub>Hai </sub><sub>Hai </sub><sub>bảng logic</sub><sub>bảng logic</sub></b> <b><sub>Inserted</sub><sub>Inserted</sub><sub> và </sub><sub> và </sub><sub>Deleted</sub><sub>Deleted</sub><sub> để sử dụng trong các </sub><sub> để sử dụng trong các </sub></b>
<b>trigger</b>
<b>trigger. Cấu trúc của hai bảng này tương tự như cấu . Cấu trúc của hai bảng này tương tự như cấu </b>
<b>trúc của bảng mà </b>
<b>trúc của bảng mà </b> <b>triggertrigger tác động. Dữ liệu trong hai tác động. Dữ liệu trong hai </b>
<b>bảng này tuỳ thuộc vào câu lệnh tác động lên bảng làm </b>
<b>bảng này tuỳ thuộc vào câu lệnh tác động lên bảng làm </b>
<b>kích hoạt </b>
<b>kích hoạt Trigger:Trigger:</b>
<b><sub>Khi câu lệnh </sub><sub>Khi câu lệnh </sub><sub>Delete</sub><sub>Delete</sub><sub> được thực thi trên bảng, </sub><sub> được thực thi trên bảng, </sub><sub>các dòng </sub><sub>các dòng </sub></b>
<b>dữ liệu bị xoá sẽ được sao chép vào trong</b>
<b>dữ liệu bị xoá sẽ được sao chép vào trong</b> <b>bảngbảng</b> <b>DeletedDeleted. . </b>
<b>Trong trường hợp này</b>
<b>Trong trường hợp này Bảng InsertedBảng Inserted</b> <b>không có dữ liệu.khơng có dữ liệu.</b>
<b><sub>Dữ liệu trong</sub><sub>Dữ liệu trong</sub></b> <b><sub>bảng Inserted</sub><sub>bảng Inserted</sub></b> <b><sub>sẽ là dòng dữ liệu được bổ </sub><sub>sẽ là dòng dữ liệu được bổ </sub></b>
<b>sung vào bảng gây nên sự kích hoạt đối với</b>
<b>sung vào bảng gây nên sự kích hoạt đối với triggertrigger </b>
<b>bằng câu lệnh </b>
<b>bằng câu lệnh </b> <b>InsertInsert. . Trong trường hợp này Trong trường hợp này</b> <b>Bảng Bảng </b>
<b>Deleted </b>
<b><sub>Khi câu lệnh </sub><sub>Khi câu lệnh </sub><sub>UPDATE</sub><sub>UPDATE</sub><sub> được thực thi trên bảng: </sub><sub> được thực thi trên bảng: </sub></b>
<b><sub>Các dòng dữ liệu cũ chịu sự tác động của câu lệnh sẽ </sub><sub>Các dòng dữ liệu cũ chịu sự tác động của câu lệnh sẽ </sub></b>
<b>được sao chép vào bảng </b>
<b>được sao chép vào bảng DeletedDeleted</b>
<b><sub>Còn trong bảng </sub><sub>Còn trong bảng </sub><sub>Inserted</sub><sub>Inserted</sub><sub> sẽ là các dòng sau khi đã được </sub><sub> sẽ là các dòng sau khi đã được </sub></b>
<b>cập nhật.</b>
<b>cập nhật.</b>
<b><sub>Thay vì chỉ định một </sub><sub>Thay vì chỉ định một </sub><sub>trigger</sub><sub>trigger</sub><sub> được kích hoạt trên một </sub><sub> được kích hoạt trên một </sub></b>
<b>bảng, ta có thể chỉ định </b>
<b>bảng, ta có thể chỉ định triggertrigger được kích hoạt và thực được kích hoạt và thực </b>
<b>hiện những thao tác cụ thể khi việc thay đổi dữ liệu </b>
<b>hiện những thao tác cụ thể khi việc thay đổi dữ liệu chỉ chỉ </b>
<b>liên quan đến một số cột nhất định nào đó của cột</b>
<b>liên quan đến một số cột nhất định nào đó của cột..</b>
<b><sub>Trong trường hợp này, ta sử dụng mệnh đề </sub><sub>Trong trường hợp này, ta sử dụng mệnh đề </sub></b> <b><sub>IF</sub><sub>IF</sub></b>
<b>UPDATE</b>
<b>UPDATE trong trigger. trong trigger. </b> <b>IF UPDATEIF UPDATE không sử dụng không sử dụng </b>
<b>được đối với câu lệnh </b>
<b><sub>Xét lại ví dụ với hai bảng </sub><sub>Xét lại ví dụ với hai bảng </sub><sub>MatHang</sub><sub>MatHang</sub><sub> và </sub><sub> và </sub><sub>NhatKyBanHang</sub><sub>NhatKyBanHang</sub><sub>, </sub><sub>, </sub></b>
<b>trigger dưới đây được kích hoạt khi ta tiến hành cập nhật </b>
<b>trigger dưới đây được kích hoạt khi ta tiến hành cập nhật </b>
<b>duy nhất</b>
<b>duy nhất 1 cột 1 cột SoluongSoluong cho bảng cho bảng NhatKyBanHangNhatKyBanHang</b>
<b>Create Trigger </b>
<b>Create Trigger tg_nhatkybanhang_update_soluong tg_nhatkybanhang_update_soluong </b>
<b>ON NhatKyBanHang</b>
<b>ON NhatKyBanHang</b>
<b>FOR UPDATE </b>
<b>FOR UPDATE </b>
<b>AS </b>
<b>AS </b>
<b>IF UPDATE</b>
<b>IF UPDATE(soluong) (soluong) </b>
<b>Update</b>
<b>Update</b> <b>mathang mathang </b>
<b>Set</b>
<b>Set MatHang.soluong = MatHang.soluong - MatHang.soluong = MatHang.soluong </b>
<b>-(</b>
<b>(InsertedInserted.soluong - .soluong - DeletedDeleted.soluong) .soluong) </b>
<b>From</b>
<b>From ( (Deleted Deleted Inner JoinInner Join</b> <b>Inserted Inserted OnOn</b>
<b>Deleted</b>
<b>Deleted.stt = .stt = InsertedInserted.stt) .stt) Inner JoinInner Join MatHang MatHang OnOn</b>
<b>MatHang.MaHang = </b>
<b><sub>Với </sub><sub>Với </sub><sub>trigger</sub><sub>trigger</sub><sub> ở ví dụ trên, câu lệnh: </sub><sub> ở ví dụ trên, câu lệnh: </sub></b>
<b>Update</b>
<b>Update NhatKyNanHang NhatKyNanHang </b>
<b>Set</b>
<b>Set soluong=soluong+20 soluong=soluong+20 </b>
<b>Where</b>
<b>Where stt=1 stt=1 </b>
<b>Sẽ kích hoạt </b>
<b>Sẽ kích hoạt </b> <b>Trigger Trigger </b> <b>ứng với mệnh đề ứng với mệnh đề </b> <b>IF UPDATEIF UPDATE</b>
<b>(soluong), </b>
<b>(soluong), câu lệnh Update trong trigger sẽ được thực thi.câu lệnh Update trong trigger sẽ được thực thi.</b>
<b><sub>Tuy nhiên câu lệnh sau khơng kích hoạt </sub><sub>Tuy nhiên câu lệnh sau khơng kích hoạt </sub><sub>trigger</sub><sub>trigger</sub><sub> này. </sub><sub> này. </sub></b>
<b>Update</b>
<b>Update NhatKyNanHang NhatKyNanHang </b>
<b>Set</b>
<b>Set nguoimua=N'Mai Hữu Toàn' nguoimua=N'Mai Hữu Toàn' </b>
<b>Where</b>
<b>Role là đối tượng xác định nhóm thuộc tính để gán </b>
<b>Role là đối tượng xác định nhóm thuộc tính để gán </b>
<b>quyền cho các user tham gia khai thác SQL Server</b>
<b>quyền cho các user tham gia khai thác SQL Server</b>
<b><sub> Server Role </sub><sub>Server Role </sub><sub>(xem bảng – Giáo trình –Tr.133)</sub><sub>(xem bảng – Giáo trình –Tr.133)</sub></b>
<b><sub>Về cơ bản giống Server Role giống các Group trong </sub><sub>Về cơ bản giống Server Role giống các Group trong </sub></b>
<b>Windwos server</b>
<b>Windwos server</b>
<b><sub>Một thành viên của bất kỳ thành Server Role nào đều </sub><sub>Một thành viên của bất kỳ thành Server Role nào đều </sub></b>
<b>có thể thêm các User khác có trong Sever Role đó</b>
<b>có thể thêm các User khác có trong Sever Role đó</b>
<b><sub>Database Role </sub><sub>Database Role </sub><sub>(xem bảng – Giáo trình –Tr.136)</sub><sub>(xem bảng – Giáo trình –Tr.136)</sub></b>
<b><sub>Các quyền truy xuất CSDL phải được cấp rõ ràng bởi </sub><sub>Các quyền truy xuất CSDL phải được cấp rõ ràng bởi </sub></b>
<b>một system administrator hoặc thành viên của </b>
<b>một system administrator hoặc thành viên của </b>
<b>administrator role trong CSDL</b>
<b>administrator role trong CSDL</b>
<b>Người dùng trong SQL Server được chia thành 2 mức: </b>
<b>Người dùng trong SQL Server được chia thành 2 mức: </b>
<b>Người truy nhập vào SQL Server gọi là </b>
<b>Người truy nhập vào SQL Server gọi là LoginLogin, người , người </b>
<b>khai thác CSDL gọi là </b>
<b>khai thác CSDL gọi là User.User.</b>
<b>Mức Login:</b>
<b>Mức Login:</b>
<b>Là đối tượng được quyền truy nhập vào SQL Server, </b>
<b>Là đối tượng được quyền truy nhập vào SQL Server, </b>
<b>tùy theo chế độ bảo mật của SQL Server mà những </b>
<b>tùy theo chế độ bảo mật của SQL Server mà những </b>
<b>login là account của Windows NT hay của SQL Server.</b>
<b>login là account của Windows NT hay của SQL Server.</b>
<b>Mức User:</b>
<b>Mức User:</b>
<b>User là đối tượng khai thác CSDL, nếu login chỉ xác </b>
<b>User là đối tượng khai thác CSDL, nếu login chỉ xác </b>
<b>định truy nhập vào SQL Server thì </b>
<b>định truy nhập vào SQL Server thì UserUser là login ID là login ID</b>
<b>tham gia khai thác CSDL.</b>
<b>tham gia khai thác CSDL.</b>
<b>sp_addlogin </b>
<b>sp_addlogin ''login_namelogin_name' , 'password' , 'database_name' ' , 'password' , 'database_name' </b>
<b>sp_droplogin </b>
<b>sp_droplogin ''login_namelogin_name' ' </b>
<b>sp_grantdbaccess </b>
<b>sp_grantdbaccess ''login_namelogin_name' ' </b>
<b>sp_revokedbaccess </b>
<b>sp_revokedbaccess ''login_namelogin_name' ' </b>
<b>sp_helprole</b>
<b>sp_helprole </b>
<b>sp_addrolemember</b>
<b>sp_addrolemember ' 'role_namerole_name' , ' , 'login_name'login_name' ' </b>
<b>sp_droprolemember</b>
<b>sp_droprolemember ' 'role_namerole_name' , ' , 'login_name'login_name' ' </b>
<b>sp_helpsrvrole</b>
<b>sp_helpsrvrole</b>
<b>sp_addsrvrolemember </b>
<b>sp_addsrvrolemember 'login_name'login_name ' , ' ,</b> <b>''role_namerole_name' ' </b>
<b>sp_dropsrvrolemember</b>
<b>sp_dropsrvrolemember 'login_name'login_name ' , ' ,</b> <b>''role_namerole_name' ' </b>
<b>Tạo User Gán Role bằng câu lệnh</b>
<b>Tạo User Gán Role bằng câu lệnh</b>
<b>Tạo User Gán Role bằng câu lệnh</b>
<b>Tạo User Gán Role bằng câu lệnh</b>