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

Tống biệt hành 2

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>

SQL



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

1. Khái niệm



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


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

2. Tạo trigger



<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


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

2. Tạo trigger


AFTER :



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


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

Một số

chú

ý



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


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

3.Các kiểu trigger



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


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

<b>Kiểm tra :</b>


insert into Nhanvien


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

3.Các kiểu trigger



<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



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

3.Các kiểu trigger



<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


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

4.Sửa đổi

trigger


ALTER TRIGGER trigger_name


ON <b>( </b><i>table </i>| view <b>) </b>


[ WITH ENCRYPTION ]
{


{ ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [


INSERT ] [ , ] [ UPDATE ] }



[ NOT FOR REPLICATION ]
AS


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

5.Xóa trigger



• 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')


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

<b>6. INSTEAD-OF trigger</b>



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


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

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


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

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>



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

Bài

tập



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.


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