2012-03-29 35 views
8

Tôi đã xem xét một số câu trả lời trước đây về trình kích hoạt ở đây nhưng không thể tìm thấy những gì tôi cần chính xác nhưng tôi chắc chắn câu hỏi của tôi đã được hỏi/trả lời trước.Tạo trình kích hoạt chèn giá trị vào bảng mới khi cột được cập nhật

Tôi đang cố gắng theo dõi bất kỳ thay đổi nào đối với cộtA và cộtB trong bảng 1.

Nếu giá trị này thay đổi, tôi muốn theo dõi các giá trị bằng cách chèn giá trị hiện tại và Giá trị mới vào một bảng khác với ngày.

Tôi đã xem xét sử dụng một cái gì đó như thế này cho chèn nhưng không chắc chắn làm thế nào để thêm được các giá trị hiện có và mới của bảng nguồn (table1):

CREATE TRIGGER NewTrigger ON table1 
FOR INSERT 
AS 

INSERT INTO table2 
     (columnA , columnB, todaysDate) 
    . 
    . 

go 

tôi cần phải sử dụng (tôi hãy suy nghĩ)

Before update ON table1 FOR EACH ROW 
    . 
    . 
    . 
BEGIN 

và xem qua tất cả thay đổi và chèn những thay đổi này sau đó thực hiện tương tự sau khi cập nhật?

Trả lời

7

Một cái gì đó như thế này nên làm những gì bạn cần. Bạn sẽ có các câu lệnh INSERT bên dưới chèn các giá trị cho biết hoạt động được thực hiện vào MyLogTable.

CREATE TRIGGER [dbo].[TRIG_MyTable] 
ON [dbo].[MyTable] 
AFTER INSERT, UPDATE 

AS 

DECLARE @INS int, @DEL int 

SELECT @INS = COUNT(*) FROM INSERTED 
SELECT @DEL = COUNT(*) FROM DELETED 

IF @INS > 0 AND @DEL > 0 
BEGIN 

    -- a record got updated, so log accordingly. 

    INSERT INTO MyLogTable 
    SELECT 'New Values', getdate() FROM INSERTED 

    INSERT INTO MyLogTable 
    SELECT 'Old Values', getdate() FROM DELETED 

END 

ELSE 
BEGIN 

    -- a new record was inserted. 

    INSERT INTO MyLogTable 
    SELECT 'Insert', getdate() FROM INSERTED 

END 

Nếu bạn muốn bạn cũng có thể thêm các cột từ INSERTEDDELETED bảng đăng nhập của bạn cũng như nếu bạn muốn nắm bắt các giá trị cột thực tế đó đã chèn hoặc cập nhật.

+1

cổ vũ ok cho câu trả lời Tôi sẽ xem xét điều này và quay lại với bạn. – Standage

+1

Xin lỗi tôi đã muốn theo dõi các giá trị thực tế trong các cột đã được chèn hoặc Cập nhật, việc này dễ dàng như thế nào? – Standage

+1

Tôi đã có một giải pháp làm việc dựa trên câu trả lời của bạn vì vậy cảm ơn !! – Standage

4

này là dành cho tất cả các thay đổi và tất cả các cột, nhưng bạn có thể thay đổi cách bạn thích:

USE [DB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE TRIGGER [dbo].[trMyTrigger] 
ON [dbo].[MyTable] 
AFTER INSERT, UPDATE, DELETE 
NOT FOR REPLICATION 
AS 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with caller queries select statements. 
    -- if an update/insert/delete occurs on the main table, the number of records affected 
    -- should only be based on that table and not what records the triggers may/may not 
    -- select. 
SET NOCOUNT ON; 

    -- Determine if this is an insert,update, or delete action 

    DECLARE @action AS CHAR(1) 
    DECLARE @count AS INT 
    SET @action = 'I' -- SET action to 'I'NSERT by default. 
    SELECT @count = count(*) FROM DELETED 
    IF @count > 0 
     BEGIN 
      SET @action= 'D' -- SET action to 'D'ELETED. 
      SELECT @count = count(*) FROM INSERTED 
      IF @count > 0 
       SET @action = 'U' -- SET action to 'U'PDATED. 
     END 

    IF @action = 'D' 
     -- THIS IS A DELETE RECORD ACTION 
     BEGIN 
      INSERT INTO myBackupTable 
     SELECT *,GETDATE() AS changeDate, 'DELETE' AS task FROM DELETED 
     END 
    ELSE 
     BEGIN 
      IF @action = 'I' 
       -- this is an INSERT record action 
       BEGIN 
        INSERT INTO myBackupTable 
        SELECT *,GETDATE() AS changeDate, 'INSERT' as task FROM INSERTED 
       END 
      ELSE 
       -- this is an UPDATE record action 
       BEGIN 
        INSERT INTO myBackupTable 
        SELECT *,GETDATE() AS changeDate, 'UPDATE' as task FROM INSERTED 
       END 
     END 
+0

Tôi không tốt trong sql để yêu cầu sily question.Is câu trả lời này nắm bắt từ tất cả các bảng hiện diện trong DB hoặc chúng ta phải cung cấp cho một tên bảng cụ thể? – SpringLearner

+0

Đây là một bảng. Bạn sẽ phải viết kịch bản động của riêng mình để làm cho trình kích hoạt hoạt động trên nhiều/tất cả các bảng. – jimdrang

1

tạo cò trigge trên abs
thay vì cập nhật như

declare @idd int , @pricee money 
    select @idd= ProductID from inserted 
    select @pricee = ListPrice from inserted 
    insert into prod values (@idd , @pricee) 
    print ' cannot change' 
Các vấn đề liên quan