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 (174.29 KB, 16 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
• <b>Trigger</b> là một kiểu thủ tục được lưu đặc biệt, chúng được tự
động gọi khi bạn sửa đổi dữ liệu mà trigger được thiết kế để
bảo vệ.
• Các trigger giúp bảo đảm sự tồn vẹn cho dữ liệu của bạn bằng
cách ngăn không cho những sự thay đổi không nhất quán được
thực hiện.
<b>CREATE TRIGGER Trigger_name </b>
<b>ON</b> <i>table | view</i>
<b>[WITH ENCRYPTION] </b>
<b>{ FOR | AFTER | INSTEAD OF }</b> <b>{[DELETE] [,] [INSERT]</b> <b>[,]</b>
<b>[UPDATE]</b> <b>}</b>
<b>AS</b> <b>Sql_statement</b>
<b>Trong</b> <b>đó</b>
WITH ENCRYPTION
- trigger được thực thi sau khi tất cả các câu lệnh SQL gây ra trigger đã
thực thi thành công.
- AFTER là kiểu mặc định nếu từ khóa FOR được dùng.
-Khơng thể định nghĩa trigger AFTER cho view
INSTEAD OF
- trigger được thực thi <b>thay</b> <b>cho</b> <b>các</b> <b>câu</b> lệnh SQL gây ra
trigger.
<b>-</b> INSTEAD OF trigger dùng được cho view.
{[DELETE] [,] [INSERT][,][UPDATE]}
• <b>deleted, inserted </b>là các bảng logic lưu các giá trị cũ và mới
của các hàng có thể bị thay đổi.
• IF UPDATE <b>(</b><i>column_list</i><b>)</b>
<b>3.1. Insert trigger</b>
Create trigger TongLuong1
On NhanVien
For Insert As
If ( (select MasoDV from <b>Inserted</b>) is Not Null)
Begin
Update DonVi
Set TongLuong = TongLuong + (select luong from Inserted )
Where MasoDV= (select MasoDV from Inserted );
<b>Kiểm tra :</b>
insert into Nhanvien
<b>3.2. Update Trigger</b>
CREATE TRIGGER UpdateMaNV
ON NhanVien
FOR UPDATE AS
IF UPDATE (MaNV)
BEGIN
PRINT ‘Khong the thay doi gia tri cua MaNV’
ROLLBACK TRANSACTION
END
<b>Kiểm tra : </b> update NhanVien
<b>3.3. Delete trigger</b>
Create trigger XoaDV
On DonVi
For Delete As
Begin
Delete from NhanVien Where MasoDV=(select MasoDV
from deleted);
Delete from DuAn Where MasoDV=(select MasoDV from
deleted);
End
ON <b>( </b><i>table </i>| view <b>) </b>
[ WITH ENCRYPTION ]
{
{ ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [
INSERT ] [ , ] [ UPDATE ] }
[ NOT FOR REPLICATION ]
AS
• DROP TRIGGER { <i>trigger_name </i>} [ <b>,</b>...<i>n </i>]
Xóa một hay nhiều trigger
Ví dụ :
USE pubs
IF EXISTS (SELECT name FROM sysobjects WHERE name =
'employee_insupd' AND type = 'TR')
• Instead Of Trigger thường dùng cho Khung nhìn với các chức năng sau :
- Cập nhật nhiều bảng một lúc trong một khung nhìn.
- Tăng điều kiện ràng buộc trên các thuộc tính so với CHECK.
- Đánh giá trạng thái của bảng trước hoặc sau khi cập nhật dữ liệu, và thực
thi một số nhiệm vụ như in thông báo lỗi, sửa đổi bảng khác.
- Cho phép một phần tập hợp câu lệnh bị từ chối trong khi các phần còn lại
vẫn được thực thi thành cơng.
Ví dụ: Tạo view NV_DV lấy thông tin từ 2 bảng NhanVien và
DonVi
Create view NV_DV
AS
Select
MasoNV,Hodem,Ten,ngaysinh,gioitinh,diachi,nv.MasoDV,Te
nDV,MasoNQL
Tạo trigger chen_NVDV trên view NV_DV dùng để chèn dữ
liệu vào các bảng tương ứng khi chèn một bản ghi vào view.
Create Trigger chen_NVDV
On NV_DV <b>Instead of Insert</b>
As
Begin
Insert into NhanVien
(MasoNV,Hodem,Ten,ngaysinh,gioitinh,diachi,MasoDV)
Select MasoNV,Hodem,Ten,ngaysinh,gioitinh,diachi,MasoDV
From <b>inserted;</b>
Insert into DonVi(MasoDV,TenDV,MasoNQL)
Select MasoDV,TenDV,MasoNQL
From <b>inserted;</b>
Viết các trigger sau :
1. Khi thông tin nhân viên làm việc cho một dự án thay đổi, nếu
tổng số giờ làm việc của nhân viên cho các dự án lớn hơn
40h/tuần, hoặc nhỏ hơn 20h/tuần thì hiển thị thơng báo.
2. Khi một nhân viên bị xóa, hãy xóa các thông tin về dự án,
người phụ thuộc liên quan đến nhân viên đó. Nếu nhân viên đó
là người quản lý đơn vị, thì giá trị MaNQL=null, nếu nhân
viên là người giám sát thì giá trị MaNGS của các nhân viên
dưới sự giám sát của người này là null.