2012-05-11 14 views
17

Làm cách nào để xác định liệu có điều gì đó đã thay đổi trong trình kích hoạt UPDATE? Ví dụ: tôi có bảng có tên là người chỉ có một cột NAME chứa giá trị 'Mike'. Nếu tôi chạyLàm thế nào để xác định xem có bất cứ điều gì thay đổi trong kích hoạt cập nhật trong t-sql

UPDATE person SET NAME = 'Mike' 

làm cách nào tôi có thể xác định trong trình kích hoạt cập nhật không có gì thay đổi? Tôi biết về CẬP NHẬT (col) tuyên bố, nhưng tôi không muốn lặp qua các cột. Có cách nào khác để thực hiện việc này không?

Trả lời

30

Cập nhật (cột) chỉ nêu rõ cột đó đã tham gia cập nhật, nhưng không phải là giá trị của nó đã thay đổi. Ví dụ:

update Person SET Name = Name 

sản lượng đúng trong bản cập nhật (tên) mặc dù tên chưa được thay đổi trong bất kỳ hàng nào.

Để kiểm tra xem các giá trị mới có khác với giá trị cũ hay không, bạn sẽ sử dụng except vì ngoại trừ sẽ xóa các hàng khỏi tập hợp hàng đầu tồn tại trong tập hợp đáy. Vì bảng người có thể có khóa chính nên không có nguy cơ xóa mục đã thay đổi có đối tác bị xóa. Tuy nhiên, nếu bạn quyết định thay đổi * thành danh sách các cột thú vị, hãy nhớ bao gồm khóa chính.

insert into logTable (ID) 
select a.ID 
from 
(
    select * from Inserted 
    except 
    select * from Deleted 
) a 

Lợi ích bổ sung là tính năng này cũng hoạt động để chèn vì quá trình xóa sẽ trống và tất cả các hàng từ được chèn sẽ được trả lại.

+0

Cảm ơn, điều đó phù hợp với tôi! –

14

Đề cập đến câu trả lời Arion của trên:

Hãy chắc chắn để so sánh các hồ sơ theo khóa chính của họ khi lựa chọn từ lệnh JOIN kể từ khi chèn vào và bảng DELETED có thể chứa nhiều hơn một hồ sơ, trong đó - nếu bỏ qua - có thể dẫn đến cả sai kết quả truy vấn và tác động tiêu cực đến hiệu suất DB.

-- Anrion's answer - slightly modified 
CREATE TRIGGER UpdatedTriggerName 
ON person -- table name 
AFTER UPDATE 
AS 
IF EXISTS (
    SELECT 
     * 
    FROM 
     INSERTED I 
     JOIN 
     DELETED D 
      -- make sure to compare inserted with (same) deleted person 
      ON D.ID = I.ID 
      AND D.NAME <> I.NAME -- only persons with changed name 
    ) 
print 'something' 
GO 
+1

Câu trả lời hay! –

Các vấn đề liên quan