Tải bản đầy đủ (.ppt) (30 trang)

Giao Trinh SQL bai 131415

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>CURSOR</b>



<b>CURSOR</b>


<b>13</b>



</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

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


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

<b>Khi sử dụng cursor trong SQL Server:</b>



<b>Khi sử dụng cursor trong SQL Server:</b>



<b>•</b>



<b>•</b>

<b>Cursor cần phải khai báo và các thuộc tính của </b>

<b>Cursor cần phải khai báo và các thuộc tính của </b>


<b>nó cũng cần được xác định</b>



<b>nó cũng cần được xác định</b>


<b>•</b>



<b>•</b>

<b>Mở cursor</b>

<b>Mở </b>

<b>cursor</b>

<b>.</b>

<b>.</b>


<b>•</b>




<b>•</b>

<b>Phải lấy (fetch</b>

<b>Phải lấy (</b>

<b>fetch</b>

<b>) các dòng cần thiết từ cursor</b>

<b>) các dòng cần thiết từ </b>

<b>cursor</b>

<b>.</b>

<b>.</b>


<b>•</b>



<b>•</b>

<b>Dữ liệu trong dịng hiện hành có thể được hiệu </b>

<b>Dữ liệu trong dòng hiện hành có thể được hiệu </b>


<b>chỉnh nếu cần thiết.</b>



<b>chỉnh nếu cần thiết.</b>


<b>•</b>



<b>•</b>

<b>Tạm thời khơng dùng cursor thì phải đóng cursor </b>

<b>Tạm thời khơng dùng cursor thì phải đóng cursor </b>


<b>lại.</b>



<b>lại.</b>


<b>•</b>



<b>•</b>

<b>Cursor cần phải được giải phóng khi không cần </b>

<b>Cursor cần phải được giải phóng khi khơng cần </b>


<b>dùng nữa.</b>



</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

<b>2. Phân Loại Cursor:</b>



<b>2. Phân Loại Cursor:</b>



<b>a. Static Cursor:</b>


<b>a. Static Cursor:</b>



<b>•</b>



<b>•</b>

<b>Tập kết quả của con trỏ loại Static được xây dựng </b>

<b>Tập kết quả của con trỏ loại Static được xây dựng </b>


<b>trong </b>




<b>trong tempdb</b>

<b>tempdb</b>

<b> khi con trỏ được mở.</b>

<b> khi con trỏ được mở.</b>


<b>•</b>



<b>•</b>

<b>Con trỏ không phản ánh được bất kỳ sự thay đổi </b>

<b>Con trỏ không phản ánh được bất kỳ sự thay đổi </b>


<b>nào trong database ngay cả khi những dòng dữ </b>


<b>nào trong database ngay cả khi những dịng dữ </b>



<b>liệu có thay đổi.</b>


<b>liệu có thay đổi.</b>


<b>•</b>



<b>•</b>

<b>Tất cả t</b>

<b>Tất cả t</b>

<b>hao tác Insert</b>

<b>hao tác </b>

<b>Insert</b>

<b>, Update</b>

<b>, </b>

<b>Update</b>

<b>, Delete</b>

<b>, </b>

<b>Delete</b>

<b> đều khơng </b>

<b> đều khơng </b>


<b>có tác dụng khi dùng </b>



</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

<b>b. Keyset-driven Cursor:</b>


<b>b. Keyset-driven Cursor:</b>



<b>•</b>



<b>•</b>

<b>Thành viên và thứ tự của các dòng trong một </b>

<b>Thành viên và thứ tự của các dòng trong một </b>


<b>keyset-driven cursor</b>



<b>keyset-driven cursor</b>

<b> là cố định khi cursor được </b>

<b> là cố định khi cursor được </b>


<b>mở. Con trỏ được điều khiển bởi một tập giá trị </b>


<b>mở. Con trỏ được điều khiển bởi một tập giá trị </b>



<b>nhận dạng gọi là </b>



<b>nhận dạng gọi là Keyset</b>

<b>Keyset</b>

<b>. Keyset được xây dựng </b>

<b>. Keyset được xây dựng </b>


<b>trong </b>




<b>trong Tempdb</b>

<b>Tempdb</b>

<b> khi con trỏ được mở.</b>

<b> khi con trỏ được mở.</b>


<b>•</b>



<b>•</b>

<b>Cho phép hiệu chỉnh (update</b>

<b>Cho phép hiệu chỉnh (</b>

<b>update</b>

<b>, delete</b>

<b>, </b>

<b>delete</b>

<b>) dữ liệu trên </b>

<b>) dữ liệu trên </b>


<b>cột không là keyset (bởi chủ cursor hoặc từ user </b>


<b>cột không là keyset (bởi chủ cursor hoặc từ user </b>



<b>khác) khi user duyệt thông qua con trỏ.</b>


<b>khác) khi user duyệt thơng qua con trỏ.</b>


<b>•</b>



</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

<b>c. Dynamic Cursor:</b>


<b>c. Dynamic Cursor:</b>


<b>•</b>



<b>•</b>

<b> Cursor</b>

<b>Cursor</b>

<b> phản ánh được toàn bộ sự thay đổi của </b>

<b> phản ánh được toàn bộ sự thay đổi của </b>


<b>các dòng dữ liệu trong tập kết quả khi duyệt </b>


<b>các dòng dữ liệu trong tập kết quả khi duyệt </b>



<b>Cursor</b>


<b>Cursor</b>


<b>•</b>



<b>•</b>

<b>Giá trị dữ liệu, thứ tự, và thành viên của các </b>

<b>Giá trị dữ liệu, thứ tự, và thành viên của các </b>


<b>dòng trong tập kết quả có thể thay đổi ứng với </b>


<b>dòng trong tập kết quả có thể thay đổi ứng với </b>



<b>mỗi lần duyệt con trỏ.</b>


<b>mỗi lần duyệt con trỏ.</b>



<b>•</b>



<b>•</b>

<b>Tất cả các lệnh Insert, Update, Delete</b>

<b>Tất cả các lệnh </b>

<b>Insert, Update, Delete</b>

<b> của các </b>

<b> của các </b>


<b>user đều hữu hiệu thông qua con trỏ.</b>



<b>user đều hữu hiệu thông qua con trỏ.</b>


<b>d. Fast Forward Cursor: </b>



<b>d. Fast Forward Cursor: </b>



<b>Chỉ duyệt con trỏ theo một chiều từ </b>



</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

<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> </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>


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

<b>Ghi chú:</b>



<b>Ghi chú:</b>



<b>•</b>



<b>• Select_statement:</b>

<b>Select_statement:</b>

<b> Là câu lệnh truy vấn để định </b>

<b> Là câu lệnh truy vấn để định </b>


<b>nghĩa tập kết quả của cursor. Từ khóa </b>


<b>nghĩa tập kết quả của cursor. Từ khóa </b>



<b>COMPUTE</b>



<b>COMPUTE</b>

<b>, COMPUTE BY</b>

<b>, </b>

<b>COMPUTE BY</b>

<b>, FOR BROWSE, </b>

<b>, FOR BROWSE, </b>


<b>and </b>



<b>and INTO</b>

<b>INTO</b>

<b> không cho phép trong select_statement </b>

<b> khơng cho phép trong select_statement </b>


<b>•</b>




<b>• READ ONLY</b>

<b>READ ONLY</b>

<b> không cho phép Update trong </b>

<b> không cho phép Update trong </b>


<b>cursor này.</b>



<b>cursor này.</b>


<b>•</b>



<b>• UPDATE</b>

<b>UPDATE</b>

<b> [OF </b>

<b>[OF </b>

<b>column_name [,…n]]:</b>

<b>column_name</b>

<b> [,…n]]:</b>

<b> Quy định </b>

<b> Quy định </b>


<b>cột cho phép được </b>



<b>cột cho phép được update</b>

<b>update</b>

<b> khi dùng cursor. Nếu </b>

<b> khi dùng cursor. Nếu </b>


<b>OF column_name</b>



<b>OF column_name</b>

<b> [,n…] được chỉ định rõ ràng thì </b>

<b> [,n…] được chỉ định rõ ràng thì </b>


<b>chỉ có các cột được chỉ định mới được cho phép </b>


<b>chỉ có các cột được chỉ định mới được cho phép </b>



<b>hiệu chỉnh, nếu khơng có column list, </b>



<b>hiệu chỉnh, nếu khơng có column list, all columns </b>

<b>all columns </b>


<b>có thể update.</b>



</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

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


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

<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>trên bảng</b>


<b>DELETE</b>


<b>DELETE <Ten Table> <Ten Table></b>


<b>WHERE CURRENT</b>


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

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


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

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


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

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


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

<b>TRIGGER</b>



<b>TRIGGER</b>



<b>14</b>



</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

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


</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

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


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

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



</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

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


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

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


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

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


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

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


</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

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


</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>

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


</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

<b>Bảo mật trong SQL Server</b>



<b>Bảo mật trong SQL Server</b>


<b>15</b>



</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

<b><sub>Windows Authentication </sub></b>

<b><sub>Windows Authentication </sub></b>



<b>Mode: </b>


<b>Mode: </b>



<b>Windows Authentication:</b>



<b>Windows Authentication:</b>




<b>User phải là những User </b>


<b>User phải là những User </b>



<b>được Windows quản lý mới </b>


<b>được Windows quản lý mới </b>



<b>được truy nhập.</b>


<b>được truy nhập.</b>



<b><sub>Mixed Mode:</sub></b>

<b><sub>Mixed Mode:</sub></b>



<b>Windows and SQL Server </b>



<b>Windows and SQL Server </b>



<b>Authentication: </b>



<b>Authentication: </b>

<b>User của </b>

<b>User của </b>


<b>Windows và SQL Server để </b>


<b>Windows và SQL Server để </b>



<b>có thể thiết lập để truy </b>


<b>có thể thiết lập để truy </b>



<b>nhập SQL Server</b>


<b>nhập SQL Server</b>



<b>CHẾ ĐỘ BẢO MẬT – SECURITY MODE</b>



</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>

<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>SERVER ROLE và DATABASE ROLE</b>



</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>

<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>QUẢN TRỊ NGƯỜI DÙNG</b>



</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>

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


</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>

<b>Vd</b>



<b>Vd</b>

<b>1: </b>

<b>1: </b>




<b>sp_addlogin</b>



<b>sp_addlogin</b>

<b>'</b>

<b>'</b>

<b>admin' , '123456' , 'QLyDiem' </b>

<b>admin' , '123456' , 'QLyDiem' </b>


<b>sp_grantdbaccess </b>



<b>sp_grantdbaccess </b>

<b>'admin' </b>

<b>'admin' </b>


<b>sp_addrolemember</b>



<b>sp_addrolemember</b>

<b> '</b>

<b> '</b>

<b>db_owner</b>

<b>db_owner</b>

<b>' , 'admin' </b>

<b>' , 'admin' </b>


<b>sp_addsrvrolemember </b>



<b>sp_addsrvrolemember </b>

<b>'admin' ,</b>

<b>'admin' ,</b>

<b> '</b>

<b> </b>

<b>'</b>

<b>sysadmin</b>

<b>sysadmin</b>

<b>' </b>

<b>' </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>


</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>

<b>Database role</b>


<b>Database role</b>



<b>Server role</b>


<b>Server role</b>



</div>

<!--links-->

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×