YOMEDIA
ADSENSE
Khái quát về Trigger – Phần 1
141
lượt xem 24
download
lượt xem 24
download
Download
Vui lòng tải xuống để xem tài liệu đầy đủ
Trigger có thể xem là một dạng đặc biệt của th ủ tục n ội tại, bởi vì bên trong nội dung của trigger l ưu trữ các câu l ệnh dùng để thực hiện một số hành động nào đó mà ngưới lập trình sẽ chỉ ra
AMBIENT/
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Khái quát về Trigger – Phần 1
- -1- Khái quát về Trigger – Phần 1 Trigger có thể xem là một dạng đặc biệt của th ủ tục n ội tại, bởi vì bên trong nội dung của trigger l ưu trữ các câu l ệnh dùng để thực hiện một số hành động nào đó mà người lập trình sẽ chỉ ra. 1/- Trigger là gì ? Tuy nhiên khác với thủ tục nội tại, trigger hoàn toàn không có tham s ố. Ngoài ra chúng ta có thể gọi thực hiện trực tiếp trigger bằng lệnh EXECUTE như thủ tục nội tại hoặc bằng bất kỳ một lệnh nào khác, thay vào đó trigger sẽ được th ực hi ện m ột cách tự động khi dữ liệu của bảng có liên quan đến trigger bị cập nhật. Chính nhờ vào tính năng đặc biệt là tự động thực hiện mà nội dung các l ệnh bên trong trigger được dùng cho các công việc sau : • Kiểm tra các ràng buộc toàn vẹn dữ liệu phức tạp. • Thực hiện các xử lý được thiết kế thi hành tại server (trong mô hình client/server). Các xử lý mà ta muốn chúng sẽ được tự động thực hiện khi có thao tác INSERT, UPDATE hoặc DELETE xảy ra. • Trigger cũng được dùng để thay thế các constraint trong tr ường h ợp ta mu ốn vi ệc kiểm tra ràng buộc dữ liệu kèm theo các câu thông báo thích h ợp theo ý mu ốn ng ười dùng. 2/- Mở rộng ràng buộc toàn vẹn dữ liệu với các Trigger Có 3 thao tác cơ bản làm thay đổi dữ liệu trên các bảng của c ơ sở d ữ li ệu đó là thao tác thêm (insert), thao tác sửa (update) và thao tác xóa (delete). Như vậy để đảm b ảo dữ liệu nhất quán và đúng đắn, ta cần kiểm tra việc thực hiện của 3 thao tác này. Có 2 cách kiểm tra : kiểm tra mức giao diện và kiểm tra mức cơ sở dữ liệu. • Kiểm tra mức giao diện : công việc này chính là công việc lập trình trên các màn hình giao diện. • Kiểm tra mức cơ sở dữ liệu : công việc này được thực hiện bởi các đối tượng constraint hoặc trigger. Đối với các ràng buộc toàn vẹn dữ liệu đơn giản như kiểm tra các ràng bu ộc mi ền giá trị, kiểm tra các ràng buộc giữa các thuộc tính trên cùng m ột bảng dữ liệu, … ta nên sử dụng đối tượng constraint.
- -2- Đối với các ràng buộc toàn xẹn dữ liệu phức tạp khác – là nh ững quy t ắc đ ược đ ịnh nghĩa dùng để kiểm tra tính toàn vẹn của dữ liệu trên nhiều cột ho ặc nhiều dòng c ủa các bảng khác nhau. Khi đó bắt buộc chúng ta phải sử dụng đối tượng trigger, đ ối tượng này cho phép chúng ta xây dựng các câu lệnh bên trong nó v ới m ục tiêu là các câu lệnh này sẽ được thực hiện khi các thao tác làm thay đổi dữ liệu xảy ra trên bảng dữ liệu mà nó gắn. Một trigger gắn với duy nhất một đối tượng table hoặc một đối tượng view. 3/- Các dạng ràng buộc toàn vẹn dữ liệu nên dùng Trigger Trên SQL Server, có 2 cách thực hiện ràng buộc toàn vẹn dữ liệu : • Ràng buộc toàn vẹn dữ liệu bằng phương pháp mô tả (declarative data integrity). Thực hiện ràng buộc dữ liệu theo phương pháp này chính là các công vi ệc xác đ ịnh ràng buộc khóa chính, khóa ngoại, kiểm tra miền giá trị, … và mô t ả chúng t ại th ời điểm tạo table. Đặc điểm cần biết của phương pháp này là việc kiểm tra sẽ được thực hiện trước khi cho phép ghi vào table. • Ràng buộc toàn vẹn dữ liệu bằng phương pháp theo th ủ tục (procedural data integrity). Trong phương pháp này, việc ràng buộc toàn vẹn dữ li ệu đ ược xác đ ịnh b ởi t ập h ợp các câu lệnh T-SQL. Các câu lệnh chứa bên trong đối tượng Trigger, chúng s ẽ đ ược gọi thi hành khi có thao tác thêm, xóa, hoặc sửa dữ liệu xảy ra trên table tương ứng. Đặc điểm cần biết của phương pháp này là việc kiểm tra sẽ đ ược th ực hi ện sau khi dữ liệu được ghi vào table. 4/- Khi nào thì sử dụng Trigger ? Để giải đáp thỏa đáng vấn đề này, chúng ta xem xét ví dụ sau : Cho một cơ sở dữ liệu có cấu trúc sau : • KHACH_HANG(ID_KHG, Ten_NCC) • PHIEU_XUAT(ID_PX, So_PX, Ngay_PN, #ID_KHG) • CT_PHIEU_XUAT(#ID_PX, #ID_HH, SoLuong, DonGia, ThanhTien) • DM_HANGHOA(ID_HH, Ten_HH, DonGiaHienHanh)
- -3- Để bảo đảm tính nhất quán và chính xác của dữ liệu, cần thực hiện yêu cầu ràng buộc toàn vẹn dữ liệu : 1/- KHACH_HANG : Một khách hàng có 1 mả duy nhất dùng đ ể phân bi ệt khách hàng này với khách hàng khác, có 1 tên khách hàng duy nhất. 2/- DM_HANGHOA : Một hàng hóa có 1 mã hàng hóa duy nhất dùng đ ể phân bi ệt v ới hàng hóa khác, có 1 tên hàng hóa và 1 đơn giá bán hiện tại duy nhất. 3/- PHIEU_XUAT : Một phiếu xuất có 1 mã duy nhất dùng để phân bi ệt v ới phi ếu xuất khác, có 1 số phiếu xuất, 1 ngày xuất xác định. Một phiếu xuất liên quan đến duy nhất 1 khách hàng. Một phiếu xuất có ít nhất 1 chi tiết xuất. 4/- CT_PHIEU_XUAT : Một chi tiết xuất có mã phiếu xuất và mã hàng hóa dùng đ ể xác định khóa của quan hệ. Khóa này dùng để phân biệt với chi ti ết xuất khác, có 1 giá trị số lượng xác định, 1 đơn giá tương ứng với đơn giá hiện hành của hàng hóa l ấy t ừ thuộc tính DonGiaHienHanh của table DM_HANG_HOA. Giá trị của ThanhTien đ ược tính toán dựa trên công thức ThanhTien = SoLuong * DonGia. Câu hỏi đặt ra : với các yêu cầu ràng buộc toàn vẹn dữ liệu ở trên, yêu cầu nào cần phải sử dụng trigger để cài đặt ? Câu trả lời : Chỉ có ràng buộc 1 đơn giá tương ứng với đơn giá hi ện hành c ủa hàng hóa lấy từ thuộc tính DonGiaHienHanh của table DM_HANG_HOA là th ật s ự c ần phải sử dụng trigger để giải quyết vấn đề. Các ràng buộc còn lại ta có th ể s ử d ụng theo phương pháp mô tả. Các trường hợp sử dụng Trigger : • Quan điểm cơ bản cần nghĩ đến trước tiên là chỉ những ràng bu ộc d ữ li ệu nào không thể dùng phương pháp mô tả (declarative data integrity) thì mới dùng trigger đ ể gi ải quyết. Tuy nhiên, bạn không nhất thiết phải tuân thủ theo quan điểm này trên th ực t ế bạn hoàn toàn có thể dùng trigger để thay thế cho constraint trong tr ường h ợp bạn muốn tự mình kiểm soát và cho ra các câu thông báo thích hợp người dùng. • Khi có sự thay đổi dữ liệu trên 1 table và chúng ta mu ốn d ữ li ệu trên 1 hay nhi ều table khác cũng tự động thay đổi theo cho phù hợp. Ví dụ : Chúng ta có các table có cấu trúc sau :
- -4- Yêu cầu : Khi thêm mới mẫu tin trên table DON_GIA_HANG_HOA c ần update lại m ục DonGiaHienHanh trên table DM_HANG_HOA sao cho DM_HANG_HOA.DonGiaHienHanh = DON_GIA_HANG_HOA.Gia_DGHH Giải quyết vấn đề : Với các yêu cầu ràng buộc dữ liệu này, ta cần phải dùng trigger để thực hiện. • Trên thực tế đô khi người lập trình muốn thay đ ổi c ấu trúc l ưu tr ữ c ủa d ữ li ệu v ới mục tiêu tăng tốc độ xử lý hoặc việc xử lý tính toán dễ dàng hơn, đi ều này th ường dẫn đến việc phá vỡ tính chuẩn của cơ sở dữ liệu và làm tăng thêm ràng buộc toàn vẹn dữ liệu. Ví dụ, ta có trường hợp sau :
- -5- Cột TongSoTien được bổ sung vào table PHIEU_XUAT với ý nghĩa dùng đ ể ch ứa giá trị tổng số tiền của phiếu xuất. Giá trị này bằng tổng các giá trị chứa trên c ột ThanhTien của cùng phiếu xuất trên table CT_PHIEU_XUAT. Vấn đề khó khăn ở đây là khi thêm, xóa mẫu tin hoặc sửa đổi giá trị c ủa c ột ThanhTien trên CT_PHIEU_XUAT, tính đúng đắn của cột TongSoTien trên PHIEU_XUAT ph ải luôn được đảm bảo. Gặp các tình huống như thế này, bạn không c ần phải đắn đo khi quyết đ ịnh s ử d ụng triger. • Nếu bạn muốn cơ sở dữ liệu có những thông báo lỗi thích h ợp theo ý mu ốn khi thao tác thay đổi dữ liệu vi phạm ràng buộc toàn vẹn, bạn nên dùng trigger. • Tất cả các xử lý mà bạn muốn chúng tự động thực hi ện tại phía server khi có thao tác dữ liệu INSERT, UPDATE hoặc DELETE xảy ra. Khái quát về Trigger – Phần 2 Trigger không thể được tạo trên 1 table tạm (temporary table, là table được tạo với tên table có ký tự # ho ặc ## phía trước) hoặc table hệ thống (system table). Tuy nhiên cần chú ý rằng các câu lệnh bên trong trigger hoàn toàn có th ể tham chiếu đến nội dung bên trong các table tạm và table hệ thống. 5/- Các đặc trưng và hạn chế • Từ một trigger có thể xây dựng bên trong nó các câu lệnh tác đ ộng lên c ột c ủa table bất kỳ trong cơ sở dữ liệu hoặc tớti các đối tượng bên ngoài cơ sở dữ liệu hiện hành. • Có thể áp dụng trigger cho đối tượng View. • Một trigger có thể thực hiện nhiều hành động (multiple actions), và nó có th ể đ ược kích hoạt bởi nhiều hơn 1 biến cố (các biến cố gồm : insert, delete, update). • Trigger không thể được tạo trên 1 table tạm (temporary table, là table đ ược t ạo v ới tên table có ký tự # hoặc ## phía trước) hoặc table hệ thống (system table). Tuy nhiên cần chú ý rằng các câu lệnh bên trong trigger hoàn toàn có th ể tham chi ếu đến n ội dung bên trong các table tạm và table hệ thống. • Một hạn chế quan trọng mà bạn cần quan tâm là các trigger lo ại INSTEAD OF DELETE và INSTEAD OF UPDATE không thể được định nghĩa trên các table có ch ứa khóa ngoại và trên dây quan hệ nối từ table chứa nó thông qua khóa ngo ại đến table khác đã có thiết đặt tương ứng trên các dây quan hệ tính chất Cascade Delete Related Records và Cascade Update Related Fieds.
- -6- Ví dụ : Trong mối quan hệ ở hình trên, nếu ta thiết đặt tính Cascade Delete Related Records của dây quan hệ thì việc tạo trigger loại Instead Of Delete sẽ không thể thực hi ện thành công. 6/- Các biến cố trigger Có 3 biến cố tự kích họat một trigger : INSERT, UPDATE và DELETE. Các bi ến c ố xảy ra trên đối tượng table hoặc view tại thời điểm các thao tác d ữ li ệu t ương ứng tác động lên các đối tượng này. Ta không thể gọi thi hành trực tiếp 1 trigger.
- -7- Tồn tại các trường hợp chắc chắn là khi m ột sự ki ện sửa ho ặc xóa d ữ li ệu x ảy ra nhưng không kích hoạt trigger, đó là các trường hợp sau : • Khi sử dụng câu lệnh TRUNCATE TABLE sẽ không làm kích ho ạt trigger đ ược đ ịnh nghĩa cho biến cố DELETE. Một điều quan trọng c ần quan tâm đối v ới các trigger là nếu giao tác (transaction) không thành công sẽ tự động quan lui (rolled back). B ởi vì câu lệnh TRUNCATE TABLE không là một biến c ố được ghi nhận vào sổ ghi nhận biến cố, nó không thể được quay lui vì vậy nó không kích hoạt trigger DELETE. • Câu lệnh WRITETEXT cũng không là nguyên nhân gây kích ho ạt trigger INSERT hoặc UPDATE. 7/- Cơ chế hoạt động của trigger Khi thực hiện việc thêm mới một mẫu tin vào một table, thao tác này sẽ kích hoạt một trigger, trigger lưu trữ dữ liệu của mẫu tin vừa thêm m ới vào một table có tên là Inserted. Tương tự khi thực hiện việc xóa mẫu tin của m ột table, thao tác này sẽ kích hoạt một trigger, trigger lưu trữ dữ liệu của mẫu tin vừa xóa vào một table có tên là Deleted. Cấu trúc của hai bảng này hòan tòan giống với cấu trúc c ủa b ảng d ữ li ệu liên quan đến trigger khi tạo ra. Thật ra hai bảng này chỉ tồn tại trong b ộ nh ớ c ủa máy tính (RAM) được xem như là hai bảng luận lý mà chúng ta có thể sử d ụng trong các x ử lý của trigger. Chúng ta không thể tham chi ếu trực ti ếp trong ti ện ích SQL Query Analyzer hoặc bên trong các thủ tục nội tại. Chúng ta đã đề cập đến cơ chế hoạt động của trigger liên quan đến 2 thao tác thêm và xóa dữ liệu. Còn thao tác sửa đổi dữ liệu (Update) trong Microsoft SQL Server đ ược xem như là sự phối hợp của hai lệnh DELETE và INSERT (xóa b ỏ d ữ li ệu cũ và thêm vào dữ liệu mới sau khi sửa đổi) do thế mà đối với các trigger liên quan đến vi ệc sửa đổi dữ liệu thì chúng ta có thể tham chiếu đến c ả hai bảng trung gian Inserted và Deleted. Trong đó bảng Deleted sẽ chứa đựng thông tin c ủa các dòng d ữ li ệu đã b ị h ủy b ỏ, các dòng dữ liệu cũ trước khi sửa đổi, bảng Inserted sẽ chứa đựng thông tin c ủa các dòng dữ liệu mới vừa thêm vào, các dòng dữ liệu sau khi sửa đổi. Một khái niệm quan trọng liên quan đến cơ chế hoạt động của trigger mà chúng tôi muốn đề cập ở phần này, đây là khái niệm liên quan đến phần bổ sung m ới c ủa phiên bản SQL Server 2000, khái niệm INSTEAD OF và AFTER. • Trigger loại INSTEAD OF sẽ bỏ qua hành động kích ho ạt trigger (các thao tác insert, delete, update), thay vào đó nó sẽ thực hiện các câu lệnh bên trong trigger. C ần l ưu ý là nó sẽ bỏ qua hành động tác động đến cơ sở dữ liệu nhưng vi ệc lưu trữ dữ liệu vào các bảng Inserted (đối với thao tác insert), deleted (đối với thao tác delete) v ẫn đ ược thực hiện.
- -8- Ví dụ : Một câu lệnh update tác động đến một table chứa trigger loại INSTEAD OF, các câu lệnh T-SQL bên trong trigger sẽ được thi hành, nó đóng vai trò thay th ế câu l ệnh Update. Đặc tính này cho phép bạn chỉ định các câu l ệnh xử lý ph ức t ạp trong trigger nhằm làm tăng thêm lệnh thay đổi dữ liệu trên table. • Trigger loại INSTEAD OF có thể định nghĩa trên đối tượng table hoặc view. • Trigger loại AFTER là loại mặc định (cũng chính là lo ại có t ừ khóa khai báo FOR), nó có vai trò như là phần bổ sung của hành động kích ho ạt trigger. Các câu l ệnh bên trong trigger loại này chỉ được thi hành sau khi hành đ ộng kích ho ạt đã đ ược th ực hi ện rồi. Cần chú ý là các ràng buộc toàn vẹn lo ại mô t ả s ẽ đ ược th ực hi ện tr ước, k ế đó các câu lệnh bên trong trigger sẽ được thực hiện sau. Trigger lo ại AFTER ch ỉ đ ược phép định nghĩa trên duy nhất đối tượng table (không thể định nghĩa trên view). Trên một table, nếu muốn bạn có thể định nghĩa cả hai loại trigger. N ếu bạn đ ịnh nghĩa cả hai loại trigger và các constraint cho một table, thứ tự thi hành sẽ là trigger INSTEAD OF, các constraint được xử lý và sau cùng là trigger AFTER. N ếu các constraint bị vi phạm (có nghĩa là việc kiểm tra ràng bu ộc toàn v ẹn c ủa các constraint phát hiện có vi phạm tính toàn vẹn dữ liệu), các hành đ ộng c ủa trigger INSTEAD OF sẽ được quay lui, trigger AFTER không thi hành nếu các constraint b ị vi ph ạm ho ặc nếu có một số biến cố khác làm cho việc sửa đổi dữ liệu trên table bị lỗi. Giống như các thủ tục nội tại, trigger có thể được lồng đến 32 cấp và có th ể đ ược kích hoạt đệ quy. Làm việc với trigger – Phần 1 Bạn có thể sử dụng câu lệnh CREATE TRIGGER để tạo một trigger bằng cách sử dụng tiện ích SQL Query Analyzer hoặc sử dụng công cụ dạng dấu nhắc lệnh (command-prompt) điển hình như công cụ osql. 1/- Tạo mới trigger Giống như các đối tượng khác trong Microsoft SQL Server, bạn có 2 cách đ ể có th ể tạo mới một trigger : sử dụng các câu lệnh T-SQL ho ặc dùng ti ện ích Enterprise Manager. 1.1/- Sử dụng câu lệnh T-SQL : Bạn có thể sử dụng câu lệnh CREATE TRIGGER để tạo m ột trigger bằng cách s ử dụng tiện ích SQL Query Analyzer hoặc sử dụng công cụ dạng d ấu nh ắc l ệnh (command-prompt) điển hình như công cụ osql.
- -9- Khi sử dụng CREATE TRIGGER, bạn phải chú ý thực hiện những điều cốt lõi sau : • Xác định tên của trigger. Tên của trigger có tính duy nh ất trên 1 c ơ s ở d ữ li ệu (database). • Chỉ định table hoặc view mà trên đó trigger được áp dụng. • Chỉ định trigger thuộc loại INSTEAD OF hoặc AFTER. • Chỉ định một biến cố hoặc nhiều biến cố kích hoạt trigger. • Các câu lệnh tương ứng với nhiệm vụ mà bạn muốn trigger thực hiện. • Các tùy chọn : trigger cho phép nhân bản (replicate) hay không, trigger có đ ược mã hóa (encrypt) hay không. Chú ý : Mệnh đề WITH APPEND được sử dụng trong câu lệnh CREATE TRIGGER ở các phiên bản trước, không còn được sử dụng trong phiên bản SQL Server 2000. Cú pháp : a/- Mệnh đề CREATE TRIGGER : Việc tạo trigger bắt đầu với mệnh đề CREATE TRIGGER theo sau là tên c ủa trigger. Trigger không cho phép xác định tên của c ơ sở dữ li ệu như là ti ền t ố c ủa tên đ ối tượng. Do vậy cần chọn cơ sở dữ liệu với mệnh đề USE Tên_database và từ khóa GO trước câu lệnh tạo trigger. Cần phải chỉ định từ khóa GO b ởi vì câu l ệnh CREATE TRIGGER phải là câu lệnh đầu tiên trong một query batch (M ột batch là m ột lô bao gồm các câu lệnh T-SQL kết thúc bởi từ khóa GO). Mặc đ ịnh, quyền ch ủ s ở h ữu table được phép tạo trigger. Chú ý : Nếu bạn sử dụng tiện ích SQL Query Analyzer và trong tiện ích này bạn đã ch ọn đúng database cần tạo trigger, khi đó bạn có thể không c ần phải sử d ụng m ệnh đ ề USE Tên_database.
- - 10 - Ví dụ : Trong trường hợp bạn muốn tên trigger là một chuỗi gồm có cả các khoảng trắng, bạn phải đặt chúng trong cặp dấu [ ]. Ví dụ : b/- Mệnh đề ON : Trigger phải được gán tới table hoặc view, sử dụng mệnh đề ON đ ể cho bi ết table hoặc view nào được áp dụng. Ví dụ : Một trigger chỉ áp dụng cho một table hoặc view. Nếu bạn cần áp dụng thao tác trigger giống như vậy cho một table khác trong cơ sở dữ liệu, bạn phải tạo một trigger v ới một tên khác, và copy toàn bộ nội dung sang trigger m ới, sau đó áp d ụng nó cho table khác. Loại trigger mặc định AFTER chỉ có thể áp dụng cho m ột table. Lo ại trigger m ới INSTEAD OF có thể áp dụng hoặc cho một table hoặc cho một view. c/- Các mệnh đề FOR, AFTER, INSTEAD OF : Trigger phải được gán tới table hoặc view, sử dụng mệnh đề ON đ ể cho bi ết table hoặc view nào được áp dụng. Loại biến cố trigger phải được chỉ định khi trigger được tạo. Các biến cố gồm có : INSERT, UPDATE và DELETE. Một trigger có thể được kích ho ạt b ởi m ột, hai ho ặc cả 3 biến cố xảy ra. Nếu bạn muốn trigger kích ho ạt trên tất c ả các bi ến c ố thì theo
- - 11 - sau các mệnh đề FOR, AFTER hoặc INSTEAD OF là các từ khóa INSERT, UPDATE và DELETE. Các kiểu biến cố này có thể được liệt kê theo thứ tự bất kỳ. Ví dụ : Trigger loại AFTER : Chú ý : Mệnh đề FOR có ý nghĩa tương đượng với mệnh đề AFTER. Trigger loại INSTEAD OF : Chú ý : Mệnh đề FOR được thay thế với INSTEAD OF. d/- Mệnh đề AS : Mệnh đề AS được khai báo trước các câu lệnh T-SQL trong trigger. Ví dụ : Lấy lại ví dụ ở phần trình bày "các trường hợp sử dụng trigger". Yêu c ầu c ủa ví d ụ này là khi thêm mới hoặc sửa đổi mẫu tin trên table DON_GIA_HANG_HOA, ta mu ốn giá trị tại cột DonGiaHienHanh trên table DM-HANG_HOA ph ải đ ược c ập nh ật l ại theo giá trị của cột Gia_DGHH của mẫu tin vừa thêm m ới hoặc sửa đ ổi. Trigger gi ải quyết vấn đề này có thể được thực hiện như sau :
- - 12 -
- - 13 - Làm việc với trigger – Phần 2 Trên thực tế đôi khi bạn cần sửa đổi tên của trigger, trong trường hợp này, bạn có thể sử dụng một thủ tục do SQL Server cung cấp sẳn có tên là sp_rename. 1.2/- Sử dụng tiện ích Enterprise Manager : Tiện ích Enterprise Manager cho phép bạn tạo các trigger m ột cách trực quan hơn. Bạn có thể thực hiện theo các bước sau : Bước 1 : Khởi động tiện ích Enterprise Manager. Chọn tên m ột bảng mu ốn t ạo m ới trigger có liên quan, kích hoạt thực đơn tắt và chọn ti ếp ch ức năng All Task (Manage Triggers).
- - 14 - Bước 2 : Xuất hiện màn hình chỉ định các thuộc tính liên quan đến trigger. Trong màn hình định nghĩa trigger mới lần lượt chỉ đ ịnh tên c ủa trigger và các câu l ệnh cần thiết bên trong trigger để thực hiện kiểm tra các ràng buộc toàn vẹn dữ liệu. Nhấn vào nút Check Syntax để hệ thống kiểm tra cú pháp các lệnh bên trong trigger có hợp lệ hay không. Sau cùng nhấn nút OK để lưu lại nội dung c ủa trigger mà chúng ta đã tạo ra. 2/- Quản lý trigger
- - 15 - 2.1/- Thay đổi tên của trigger : Trên thực tế đôi khi bạn cần sửa đổi tên của trigger, trong trường h ợp này, b ạn có th ể sử dụng một thủ tục do SQL Server cung cấp sẳn có tên là sp_rename. Cú pháp : Ví dụ : Hoặc Ngoài việc sử dụng sp_rename cho việc đổi tên trigger, b ạn có th ể s ử d ụng nó cho việc thay đổi tên của các đối tượng khác. Bảng li ệt kê sau đây sẽ giúp bạn hi ểu rõ hơn về cách sử dụng : Cột giá trị trong bảng liệt kê ở trên tương ứng với tham số thứ ba của sp_rename. Chú ý :
- - 16 - Nếu thực hiện thành công sp_rename sẽ trả về giá trị 0, nếu bị lỗi sẽ tr ả v ề giá tr ị khác 0. 2.2/- Thay đổi nội dung các câu lệnh chứa bên trong trigger : Đôi khi nội dung của các trigger cần phải thay đ ổi l ại đ ể cho các ki ểm tra ràng bu ộc toàn vẹn dữ liệu bên trong đó được thực hiện đúng đắn. Để sửa đổi các câu l ệnh bên trong trigger, bạn có thể xóa và tạo lại trigger. Thay vì vậy, bạn có th ể b ỏ qua b ước xóa bằng cách sử dụng câu lệnh ALTER TRIGGER. Cú pháp của câu lệnh ALTER TRIGGER cũng giống như CREATE TRIGGER, nh ưng ALTER TRIGGER không gỡ bỏ trigger ra khỏi các table hệ th ống SysComments và SysObjects. Ví dụ : 2.3/- Xem các trigger : Khi trigger được tạo, tên và thông tin nhận dạng khác liên quan trigger đ ược l ưu tr ữ trong table hệ thống có tên SysObjects. a/- Bạn có thể sử dụng câu lệnh SELECT để hiển thị các trigger đang áp d ụng cho table. Ví dụ : b/- Bạn cũng có thể sử dụng thủ tục sp_helptrigger để hiển thị các đặc tính c ủa trigger trên một table. Ví dụ : Hoặc
- - 17 - Chú ý : • Bạn có thể truy vấn cột TEXT của table hệ thống SysComments đ ể th ấy các câu lệnh chứa bên trong một trigger. Điều này thật hữu ích n ếu bạn muốn sửa lại n ội dung của một trigger khi phải đang làm việc trên một tiện ích không phải là Enterprise Manager. Ví dụ : 2.4/- Xóa trigger : Xóa một trigger có nghĩa là gỡ bó nó ra khỏi các table h ệ th ống SysCommnets và SysObjects. Bạn có thể sử dụng câu lệnh DROP TRIGGER để xóa trigger. Ví dụ : 2.5/- Làm cho trigger trở nên mất hiệu lực (Disable trigger) : Trong một số trường hợp bạn cần phải tạm thời tắt trigger (làm cho nó không còn hiệu lực). Ví dụ, bạn cần tắt bớt đi một số trigger để cô lập v ấn đ ề c ần gỡ r ối, ho ặc bạn cần sửa đổi dữ liệu, chuyển dữ liệu giữa hai database, … Ví dụ : Cần tắt trigger XLThemSua_DonGiaHH trên table DON_GIA_HANG_HOA. Trong trường hợp bạn cần tắt tất cả các trigger trên m ột table, thay vì ch ỉ đ ịnh tên trigger cần tắt, bạn thay bằng từ khóa All. Ví dụ : Tắt tất cả các trigger trên table DON_GIA_HANG_HOA.
- - 18 - 2.6/- Làm cho trigger trở nên có hiệu lực (Enable trigger) : Có ý nghĩa ngược lại với Disable Trigger, có nghĩa là thao tác bật trigger (làm cho nó trở nên có hiệu lực). Ví dụ : Cần bật trigger XLThemSua_DonGiaHH trên table DON_GIA_HANG_HOA tr ước đó đã tạm thời tắt. Ví dụ : Cần bật tất cả các trigger trên table DON_GIA_HANG_HOA trước đó đã tạm thời tắt. Lập trình trigger – Phần 1 Khi có thao tác Insert, Update hoặc Delete xảy ra trên table, các thao tác này sẽ kích hoạt trigger, biến cố tạo ra một ho ặc nhiều table giả. Các table này có th ể xem nh ư là các s ổ ghi nhận giao tác (transaction logs) của biến cố. Có hai loại : table Inserted và Deleted. 1/- Các table giả (pseudo tables) Inserted và Deleted Khi có thao tác Insert, Update hoặc Delete xảy ra trên table, các thao tác này s ẽ kích hoạt trigger, biến cố tạo ra một hoặc nhiều table giả. Các table này có thể xem như là các sổ ghi nhận giao tác (transaction logs) của bi ến cố. Có hai lo ại : table Inserted và Deleted. Một biến cố insert hoặc update sẽ tạo ra một table : Inserted. Table này chứa tập m ẫu tin được thêm mới (insert) hoặc được thay đổi (update). Trigger Update cũng tạo ra một table : Deleted. Table này chứa tập m ẫu tin tồn t ại trước khi thao tác Update xảy ra. Ví dụ :
- - 19 - Trigger Them_HH được tạo và gắn với table DM_HANG_HOA. Khi thao tác insert xảy ra trên table DM_HANG_HOA, trigger Them_HH được kích hoạt. Câu l ệnh SELECT bên trong trigger sẽ hiển thị tập mẫu tin chứa trên table Inserted. Đo ạn l ệnh sau dùng để kiểm tra hoạt động của trigger : Kết quả, trigger sẽ hiển thị nội dung sau : Căn cứ trên màn hình hiển thị kết quả thi hành của trigger, ta thấy table Inserted ch ứa nội dung của mẫu tin vừa insert vào table DM_HANG_HOA. Chú ý : Trong trường hợp này table deleted sẽ không chứa thông tin nào cả. Ví dụ : Trigger Sua_HH được tạo và gắn với table DM_HANG_HOA. Khi thao tác Update xảy ra trên table DM_HANG_HOA, trigger Sua_HH được kích hoạt. Câu lệnh SELECT thứ nhất bên trong trigger sẽ hiển thị mẫu tin chứa trên table Inserted và câu l ệnh SELECT
- - 20 - thứ hai sẽ hiển thị tập mẫu tin chứa trong table deleted. Đoạn lệnh sau dùng đ ể ki ểm tra hoạt động của trigger : Kết quả tương ứng với câu lệnh SELECT thứ nhất hiển thị nội dung chứa trong table Inserted : Kết quả tương ứng với câu lệnh SELECT thứ hai hiển thị nội dung chứa trong table deleted : Căn cứ trên màn hình hiển thị kết quả thi hành của trigger, ta thấy table Inserted ch ứa nội dung của mẫu tin vừa được sửa và table deleted ch ứa n ội dung c ủa m ẫu tin t ại thời điểm trước khi sửa. Khi có thao tác Delete xảy ra trên table, thao tác này sẽ kích hoạt trigger, bi ến c ố tạo ra một table Deleted. Table này chứa tập mẫu tin vừa bị xóa. Ví dụ :
ADSENSE
CÓ THỂ BẠN MUỐN DOWNLOAD
Thêm tài liệu vào bộ sưu tập có sẵn:
Báo xấu
LAVA
AANETWORK
TRỢ GIÚP
HỖ TRỢ KHÁCH HÀNG
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn