2012-03-01 37 views
11

Tôi có một bảng có 3 trường [ID, Tên, LastUpdated].
LastUpdated có giá trị mặc định là "GetDate() để nó tự động điền khi bản ghi mới được thêm vào.Cập nhật trình kích hoạt T-SQL

Khi tôi thay vì chạy UPDATE trên TABLE, tôi muốn đặt lại trường này thành GetDate hiện tại .()

CREATE TRIGGER dbo.Table1_Updated 
    ON dbo.Table1 
    AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 
    UPDATE dbo.Table1 SET LastUpdated = GETDATE() 
END 
GO 

Nhưng bởi vì tôi không có một mệnh đề WHERE, tất cả hồ sơ được cập nhật

HỎI:.
tôi sẽ nhận được giá trị của ID của bản ghi được cập nhật vào đâu một UPD Kích hoạt ATE?

Thực tế là tôi đang cập nhật trường của bảng bên trong Trình kích hoạt, gọi lại sự kiện Kích hoạt mới (v.v ...)?

+0

@Damien_The_Unbeliever Chắc chắn tôi hiểu rằng, nhưng chủ đề này chỉ là một mẫu cho tôi để hiểu khái niệm. đây không phải là mã thực. –

Trả lời

21

Từ 'INSERTED', bảng INSERTED phổ biến cho cả trình kích hoạt INSERT, UPDATE.

CREATE TRIGGER dbo.Table1_Updated 
ON dbo.Table1 
FOR INSERT, UPDATE /* Fire this trigger when a row is INSERTed or UPDATEd */ 
AS BEGIN 
    UPDATE dbo.Table1 SET dbo.Table1.LastUpdated = GETDATE() 
    FROM INSERTED 
    WHERE inserted.id=Table1.id 
END 
+0

vì vậy ngay cả khi TSQL chỉ đang làm một CẬP NHẬT trên bất kỳ trường nào, bên trong trình kích hoạt tôi đi và tìm kiếm bảng ảo đã chèn? BTW, tôi có cần đặt INSERT ... ngay cả khi tôi chỉ cần FOR UPDATE? –

1
Update table1 
set LastUpdated = getdate() 
from inserted i, table1 a 
where i.pk1 = a.pk1 
+0

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=57227 –

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