Logo of Vovisoft

Triggers And Views 

Ðể đọc và hiểu bài viết này bạn nên đọc qua Bài 6: Stored Procedure And Advanced T-SQL   

Trong bài này chúng ta sẽ tìm hiểu ứng dụng của một loại stored procedure đặc biệt  gọi là Triggers và dùng Views để thể hiện data trong một hay nhiều table như thế nào.

Triggers

Trigger là một loại stored procedure đặc biệt được execute (thực thi) một cách tự động khi có một data modification event xảy ra như Update, Insert hay Delete. Trigger được dùng để đảm bảo Data Integrity hay thực hiện các business rules nào đó.

Khi nào ta cần sử dụng Trigger:

Ðặc điểm của Trigger:

Tạo Một Trigger Như Thế Nào?

Cú pháp căn bản để tạo ra một trigger có dạng như sau:

CREATE TRIGGER trigger_name

ON table_name or view_name

FOR trigger_class and trigger_type(s)

AS Transact-SQL statements

Như vậy khi tạo ra một trigger ta phải chỉ rõ là tạo ra trigger trên table nào và được trigger khi nào (insert, update hay delete. Sau chữ AS là các câu lệnh SQL xử lý công việc.

Ta hãy nghiên cứu một ứng dụng thực tiễn sau. Giả sử ta viết một application cho phép user có thể Insert, Update và Delete những thông tin nằm trong database. User này thường là những người không thông thạo lắm về computer mà chúng tôi thường gọi đùa là "bà tám". Vào một ngày đẹp trời, "bà tám" mặt mày tái xanh đến cầu cứu ta vì đã lỡ tay "delete" những thông tin khá quan trọng và hy vọng ta có thể phục hồi dữ liệu dùm. Nếu chúng ta không phòng xa trước khi viết application thì coi như cũng vô phương cứu chữa vì data đã hoàn toàn bị delete.

Nhưng nếu bạn là một "guru" bạn sẽ gật gù "chuyện này khó lắm!" nhưng sau đó bạn chỉ tốn vài phút đồng hồ để rollback. Muốn làm được chuyện này chúng ta phải dùng một "chiêu" gọi là Audit (kiểm tra hay giám sát). Tức là ngoài các table chính ta sẽ thêm các table phụ gọi là Audit tables. Bất kỳ hoạt động nào đụng chạm vào một số table quan trọng trong database ta đều ghi nhận vào trong Audit table. Ví dụ khi user update hay delete một record trong table nào đó thì trước khi update hay delete ta sẽ âm thầm di chuyển record đó sang Audit table rồi mới update hay delete table chính. Như vậy nếu có chuyện gì xảy ra ta có thể dễ dàng rollback (trả record về chỗ cũ).

Ví dụ:

Ta có table Orders trong PracticeDB. Ðể audit các hoạt động diễn ra trên table này ta tạo ra một audit table với tên Aud_Orders với các column giống y hệt với Orders table. Ngoài ra ta thêm vào 2 columns :

(Nếu trong môi trường nhiều user thì ta thêm một column UserID để ghi nhận user nào thay đổi).

Sau đó ta sẽ tạo ra 3 trigger dùng cho việc audit  như sau:

	--Insert Trigger
	CREATE TRIGGER [AuditInsertOrders] 
	ON [dbo].[Orders] 
	FOR Insert 
	AS
	insert into aud_orders select *,'I',getdate() From inserted
	--Update Trigger
	CREATE TRIGGER [AuditUpdateOrders] 
	ON [dbo].[Orders] 
	for UPDATE 
	AS
	insert into aud_orders select *,'U',Getdate() from deleted 

	--Delete Trigger
	CREATE TRIGGER [AuditDeleteOrders] 
	ON [dbo].[Orders] 
	FOR DELETE 
	AS
	insert into aud_orders select *,'D',getdate() From deleted

Trong ví dụ trên khi user insert một record thì record mới vừa được insert sẽ nằm trong inserted table như đã trình bày ở phần trên. Do đó ta sẽ select tất cả các column trong inserted table cộng thêm Audit Type "I" và dùng hàm GetDate() trong SQL Server để lấy system date time dùng cho Date_Time_Stamp column, sau đó insert vào Aud_Orders table. Tương tự với trường hợp Update và Delete, record đã được update hay delete nằm trong deleted table.

Như vậy trở lại trường hợp thí dụ ở trên nếu "bà tám" yêu cầu ta có thể vào tìm kiếm trong audit table để phục hồi lại record. Ngoài ra ta có thể dùng table này để tìm ra thủ phạm đã xoá hay sửa chữa data khi cần thiết.

Ðể tạo ra hay xem một trigger bằng Enterprise Manager bạn làm như sau: Right-Click lên table mà bạn muốn tạo trigger->All Tasks-> Manage Triggers.

Lưu ý: Ðôi Khi ta chỉ muốn trigger thực sự hoạt động khi một hay vài column nào đó được Update chứ không phải bất kỳ column nào. Khi đó ta có thể dùng hàm Update(Column_Name) để kiểm tra xem column nào đó có bị update hay không.

Ví dụ:

Tạo một trigger cho Customer table. Bên trong Trigger (sau chữ AS) ta có thể kiểm tra xem nếu column First_Name hay Last_Name bị thay đổi thì mới hành động nếu không thì không làm gì cả

	IF UPDATE (first_name) OR UPDATE (Last_Name)
	BEGIN
		Do some conditional processing when either of these columns are updated.
	END

Nếu muốn kiểm tra nhiều columns ta có thể dùng hàm khác là Columns_Updated() . Xin xem thêm trong SQL Server Books Online để biết thêm chi tiết về cách sử dụng.

Views

Ðịnh nghĩa một cách đơn giản thì view trong SQL Server tương tự như Query trong Access database. View có thể được xem như một table ảo mà data của nó được select từ một stored query. Ðối với programmer thì view không khác chi so với table và có thể đặt ở vị trí của table trong các câu lệnh SQL. Ðặc điểm của View là ta có thể join data từ nhiều table và trả về một recordset đơn. Ngoài ra ta có thể "xào nấu" data (manipulate data) trước khi trả về cho user bằng cách dùng một số logic checking như (if, case...).

Ví dụ:

	Create View OrderReport
	As	
	Select OrderID,
	       (case when [Name] is null then 'New Customer'
		else [Name]
		end )As CustomerName,
		ProductName,
		DateProcessed
	From Customers Right Outer Join Orders on Customers.CustomerID=Orders.CustomerID

Trong ví dụ trên ta chủ yếu trả về data từ Orders table trong PracticeDB nhưng thay vì display CustomerID vốn không có ý nhiều ý nghĩa đối với user ta sẽ display tên của customer bằng cách join với Customer table. Nếu Customer Name là Null nghĩa là tên của customer đã đặt order không tồn tại trong system. Thay vì để Null ta sẽ display "New Customer" để dễ nhìn hơn cho user.

Nói chung câu lệnh SQL trong View có thể từ rất đơn giản như select toàn bộ data từ một table cho đến rất phức tạp với nhiều tính năng programming của T-SQL.

View Thường Ðược Dùng Vào Việc Gì?

View thường được sử dùng vào một số công việc sau:

Khi sử dụng view ta có thể select,insert, update, delete data bình thường như với một table.

Ví dụ:

	Select * From OrderReport
	Where DateProcessed <'2003-01-01'
	

Lưu ý: Trong Enterprise Edition (và Developer Edition) ta có thể tạo Index cho View như cho table. Index sẽ được bàn đến trong các bài sau.

Muốn hiểu rõ hơn về bài học này bạn cần làm bài tập số 3.

Như vậy trong bài này chúng ta đã tìm hiểu Trigger, View trong SQL Server và một số ứng dụng của nó. Nói chung view thường được dùng để trừu tượng hóa (abstract) hay lọc raw data (data thô) trước khi trả về cho user trong khi trigger thường được dùng để bảo đảm tính integrity của database.

Bài 8 Data Transformation Service (DTS)

  Học SQL Server 2000