Tải bản đầy đủ (.pdf) (34 trang)

BẢNG ĐIỂM HỌC PHẦN SQL – LỚP CT15

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 (1.45 MB, 34 trang )

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

<i><b>Nội dung </b></i>


<b>Trigger </b>



<b>Khung nhìn </b>



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

<i><b>Trigger -Giới thiệu </b></i>



<b>Là một loại stored procedure đặc biệt </b>



– Tự động thực hiện khi có thao tác insert, delete
hoặc update trên dữ liệu


– Thường dùng để kiểm tra các ràng buộc toàn vẹn
của CSDL hoặc các qui tắc nghiệp vụ.


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

<i><b>Trigger – giới thiệu (tt) </b></i>



<b>Xử lý của trigger thường cần sử dụng đến hai </b>


<b>bảng tạm: </b>



– <b>Inserted: chứa các dòng vừa mới được thao tác </b>
insert/ update thêm vào bảng.


– <b>Deleted: chứa các dịng vừa mới bị xóa khỏi bảng </b>
bởi thao tác update/delete.


<i>(update = delete dòng chứa giá trị cũ+ insert dòng </i>
<i>chứa giá trị mới) </i>


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

<i><b>Trigger – giới thiệu </b></i>




<i><b>Inserted và Deleted là các bảng trong bộ nhớ </b></i>


<b>chính </b>



– Cục bộ cho mỗi trigger


– Có cấu trúc giống như bảng (table) mà trigger định
nghĩa trên đó


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

<i><b>Trigger – giới thiệu(tt) </b></i>



<b>Nếu thao tác insert/ delete/ update thực hiện </b>



<b>trên nhiều dòng, trigger cũng chỉ được gọi một </b>


<b>lần </b>



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

<i><b>Khai báo trigger </b></i>



• Cú pháp:



<b>Create trigger</b> <i>tên_trigger </i>
<b>On</b> {<i>tên_bảng</i>|<i>tên_view</i>}


{<b>For</b>| <b>After</b>| <b>Instead of </b>} { [<b>delete</b>] [<b>,</b>] [<b>insert</b>] [<b>,</b>] [<b>update</b>] }


<b>As </b>


{ <i>các lệnh T-sql </i>}


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

<i><b>Khai báo trigger (tt) </b></i>


<b>For | After: </b>




– Trigger được gọi thực hiện sau khi thao tác delete/
insert/ update tương ứng đã được thực hiện thành
cơng


Các dịng mới được thêm chứa <b>đồng thời</b> trong bảng dữ
liệu và bảng inserted


Các dịng bị xố chỉ nằm trong bảng deleted (đã bị xoá
khỏi bảng dữ liệu)


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

<i><b>Khai báo trigger (tt) </b></i>


<b>Instead of: </b>



– Trigger được gọi thực hiện thay cho thao tác
delete/ insert/ update tương ứng


Các dòng mới được thêm <b>chỉ</b> chứa trong bảng inserted


Các dịng bị chỉ định xố nằm đồng thời trong bảng
deleted và bảng dữ liệu (dữ liệu khơng bị xố).


– Trigger <i>Instead of</i> thường được dùng để xử lý cập


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

<i><b>Khai báo trigger (tt) </b></i>


<b>Lưu ý: </b>



– Lệnh tạo trigger phải là lệnh đầu tiên trong một


<i>query batch </i>



– Trên một bảng có thể định nghĩa nhiều trigger


<i>for/after</i> cho mỗi thao tác…


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

<i><b>Khai báo trigger (tt) </b></i>



– Không thể định nghĩa trigger <i>instead of</i> <i>update/ </i>


<i>delete</i> trên bảng có cài đặt khố ngoại dạng <i>update </i>


<i>cascade/ delete cascade </i>


– Trong thân trigger, có thể sử dụng hàm


<i>Update(tên_cột)</i> để kiểm tra xem việc cập nhật/
insert được thực hiện trên cột nào.


Update(<i>tên_cột</i>) = <i>true</i> : có thực hiện cập nhật trên cột


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

<i><b>Trigger -Ví dụ 1 </b></i>


<b>Cho CSDL: </b>



DatHang(MaPDT, NgayDH,…)


GiaoHang(MaPGH, MaPDH, NgayGH,…)


<i>Ràng buộc:</i> Ngày giao hàng khơng thể nhỏ hơn


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

<i><b>Trigger -Ví dụ 1 </b></i>




<b>Bảng tầm ảnh hưởng: </b>



Cần cài đặt trigger cho thao tác sửa trên đặt hàng,
và thêm/sửa trên giao hàng


Thêm Xoá Sửa


DatHang - -(*) +(NgayDH)


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

<i><b>Trigger -Ví dụ 1 (tt) </b></i>



<b>Trigger cho thao tác thêm và sửa trên giao </b>


<b>hàng: </b>



<b>Create trigger</b> tr_GH_ins_upd_NgayGH


<b>On</b> GIAOHANG <b>for insert, update </b>
<b>As </b>


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

<i><b>Trigger -Ví dụ 1 (tt) </b></i>



if <b>update</b>(MaPDH) or <b>update</b> (NgayGH)


if exists(select * from <b>inserted</b> i, DatHang d
where i.MaPDH = d.MaPDH


and i.NgayGH<d.NgayDH)
begin



<b>raiserror </b>(N‘Ngày GH không thể nhỏ hơn ngày ĐH,15,1)
<b>rollback tran </b>


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

<i><b>Trigger -Ví dụ 1 (tt) </b></i>



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

<i><b>Trigger - Ví dụ 2 (tt) </b></i>


<b>Qui định: </b>



– Các trận đấu của cùng một đội bóng phải cách
nhau tối thiểu 24 giờ


– Cầu thủ chỉ có thể thi đấu trong một trận đấu mà
đội của cầu thủ đó tham gia


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

<i><b>Thay đổi và xóa trigger </b></i>



<b>Thay đổi nội dung trigger: </b>



Thay từ khóa create trong các lệnh tạo trigger bằng


từ khóa alter

<b>Xóa trigger </b>



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

<i><b>Nội dung </b></i>



<b>Trigger </b>



<b>Khung nhìn </b>



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

<i><b>View – Khái niệm </b></i>




<b>View (khung nhìn) là một bảng ảo được định </b>


<b>nghĩa bởi một lệnh select </b>



– Đối với người dùng: view giống như một bảng thật
– Dữ liệu của view là dữ liệu trong một hoặc nhiều


bảng thật (view không chứa dữ liệu thật sự)


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

<i><b>View – Khái niệm (tt) </b></i>


<b>Mục đích sử dụng: </b>



– Thể hiện dữ liệu ở dạng phù hợp với từng nhóm
nghiệp vụ/ nhóm NSD.


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

<i><b>View – Khai báo </b></i>


<b>Cú pháp: </b>



<b> Create view</b> <i>view_name </i>[<b>(</b><i>column_name</i> [ ,...<i>n </i>]<b>)</b>]
[<b>with Schemabinding</b>]


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

<i><b>View – khai báo (tt) </b></i>



– <b>Schemabinding: gắn kết view với lược đồ, khi đó: </b>
Khơng thể xóa bảng hay view khác có liên quan đến định


nghĩa của view có schemabinding


Khơng thể thay đổi cấu trúc bảng/ view nếu việc thay đổi
này ảnh hưởng đến định nghĩa view có schemabinding



Các tên bảng, view trong câu select phải được viết dưới
dạng owner.Tênbảng/Tênview và tất cả phải trong cùng 1
database.


Nếu view schemabinding định nghĩa trên một view khác,
view đó cũng phải ở dạng schemabinding.


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

<i><b>View – Khai báo (tt) </b></i>


<b>Ví dụ: </b>



<b>Create view</b> ThiSinh_Nganh <b>(</b>SBD, HoTen, MaNganh, TenNganh<b>) </b>
<b>as </b>


select ts.SBD, ts.HoTen, ts.Nganh, n.TenNganh
from ThiSinh ts, Nganh n


where ts.Nganh = n.MaNganh


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

<i><b>Khai báo view – Lưu ý </b></i>



<b>Lệnh select trong định nghĩa view không được </b>


<b>chứa: </b>



– <i><b>Order by</b></i>, nếu có phải kèm với <i><b>TOP </b></i>
– <i><b>Compute/ Compute…by </b></i>


– <i><b>Select into </b></i>


<b>Khơng thể gắn kết rule hay default vào view </b>




<b>Khơng thể khai báo </b>

<i><b>trigger for/after</b></i>

<b> trên view </b>


<b>(chỉ có thể khai báo </b>

<i><b>trigger instead of</b></i>

<b>) </b>



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

<i><b>View – Sử dụng </b></i>



<b>Truy xuất dữ liệu từ view (select) </b>



– Như truy xuất trên bảng


<b>Cập nhật dữ liệu (insert/ delete/ update) </b>



– Dùng các lệnh insert / delete / update tương tự như
thao tác trên bảng.


cần xem xét thêm một số vấn đề dưới đây


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

<i><b>Cập nhật dữ liệu trên view </b></i>



<b>View chỉ có thể được cập nhật (insert/ update/ </b>


<b>delete) nếu: </b>



– lệnh select định nghĩa view không chứa:


Cột dẫn suất (tính tốn từ các cột dữ liệu thật sự)
Trong một số trường hợp có thể xóa được.


Các hàm tổng hợp (count, sum, avg, max,…)


Group by,Top, Select distinct



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

<i><b>Cập nhật dữ liệu trên view (tt) </b></i>



– Trong mệnh đề from của lệnh select phải tham


chiếu đến ít nhất một bảng ( hoặc view với dữ liệu
được lấy từ bảng), và phải select ít nhất một cột từ
dữ liệu.


– Lệnh cập nhật phải viết sao cho chỉ làm thay đổi dữ
liệu thật sự trong <i><b>một</b></i> bảng (lệnh xóa chỉ thực hiện
được nếu view chỉ tham chiếu đến đúng một bảng)
– Khơng thỏa các điều kiện trên, nhưng có trigger


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

<i><b>Cập nhật dữ liệu trên view (tt) </b></i>



<b>Ví dụ: Các view định nghĩa như sau không thể </b>


<b>cập nhật được: </b>



Create view V_SoNV


As Select MaPhong, Count (*) as SoNV
From NhanVien


Group by MaPhong


Create View V_NhanVien


As select MaNV, HoNV + ‘ ‘ +TenNV as HoTen
From NhanVien



Create View V1
Có thể


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

<i><b>Cập nhật view với Trigger Instead of </b></i>



<b>Có thể dùng trigger instead of để cập nhật </b>


<b>view </b>



– Tự xử lý thao tác cập nhật


<b>Ví dụ: Viết trigger instead of để cho phép </b>


<b>insert trên view </b>

<b>V_NhanVien</b>



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

<i><b>Cập nhật view với Trigger Instead of </b></i>



<b>create trigger</b> tr_Ins_View_NV
<b>on</b> V_NhanVien


<b>instead of insert </b>
as


insert into NhanVien (MaNV, HoNV, TenNV)
select MaNV,


left(TenNV, CharIndex(' ',TenNV)),


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

<i><b>Indexed View </b></i>



<b>Dùng khi dữ liệu của view lớn, truy xuất </b>



<b>thường xuyên </b>



<b>Cài đặt một cluster index trên view </b>

<b> view trở </b>


<b>thành index view </b>



– Dữ liệu và index của view được lưu trữ lại như một
bảng


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

<i><b>Thay đổi và xóa view </b></i>


<b>Thay đổi cấu trúc view: </b>



Thay từ khóa create trong các lệnh tạo view bằng


từ khóa alter

<b>Xóa view </b>



</div>

<!--links-->

×