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>
– 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ụ.
– <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>
– 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 đó
<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>}
– 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)
– 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
– 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…
– 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
DatHang(MaPDT, NgayDH,…)
GiaoHang(MaPGH, MaPDH, NgayGH,…)
<i>Ràng buộc:</i> Ngày giao hàng khơng thể nhỏ hơn
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)
<b>Create trigger</b> tr_GH_ins_upd_NgayGH
<b>On</b> GIAOHANG <b>for insert, update </b>
<b>As </b>
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>
– 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
Thay từ khóa create trong các lệnh tạo trigger bằng
từ khóa alter
– Đố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ự)
– Thể hiện dữ liệu ở dạng phù hợp với từng nhóm
nghiệp vụ/ nhóm NSD.
<b> Create view</b> <i>view_name </i>[<b>(</b><i>column_name</i> [ ,...<i>n </i>]<b>)</b>]
[<b>with Schemabinding</b>]
– <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.
<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
– <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>
– Như truy xuất trên bảng
– 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
– 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
– 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
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ể
– Tự xử lý thao tác cập nhật
<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)),
– Dữ liệu và index của view được lưu trữ lại như một
bảng
Thay từ khóa create trong các lệnh tạo view bằng
từ khóa alter