2012-03-29 35 views
8

我一直在尋找關於觸發器的一些以前的答案在這裏,但無法找到我需要的東西,但我確定我的問題已被問到/之前回答。創建一個觸發器,當一列更新時將值插入到一個新表中

我試圖跟蹤table1中columnA和columnB的任何更改。

如果此值發生更改,我想通過將現有值和新值插入到具有日期的其他表中來跟蹤值。

我一直在考慮使用像這樣的插入,但不知道如何添加獲取源表的現有的和新的值(表1):

CREATE TRIGGER NewTrigger ON table1 
FOR INSERT 
AS 

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

go 

我需要使用(我認爲)

Before update ON table1 FOR EACH ROW 
    . 
    . 
    . 
BEGIN 

並查看所有的變化,並插入這些第一次然後做更新後相同?

回答

7

像這樣的東西應該做你所需要的。您將在下面的INSERT語句中插入指示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 

如果你想你也可以從INSERTEDDELETED列添加到您的日誌表,以及如果你想捕捉的是得到了插入或更新的實際列值。

+1

的答案確定歡呼我會看看這個並回到你身邊。 – Standage 2012-03-29 19:31:18

+1

對不起,我確實想跟蹤插入或更新的柱面中的實際值,這很容易完成? – Standage 2012-03-29 19:40:34

+1

我有一個基於你的答案工作的解決方案,所以謝謝! – Standage 2012-03-29 21:05:38

4

這是所有的變化和所有列,但可以修改你怎麼樣:

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

我不擅長在sql中這麼問問題。這個答案是從DB中存在的所有表中捕獲的,還是我們必須給出一個特定的表名? – SpringLearner 2015-04-03 07:57:31

+0

這是一張桌子。您必須編寫自己的動態腳本才能使觸發器在多個/所有表上工作。 – jimdrang 2015-04-06 18:00:53

1

對ABS
,而不是更新CREATE TRIGGER trigge作爲

declare @idd int , @pricee money 
    select @idd= ProductID from inserted 
    select @pricee = ListPrice from inserted 
    insert into prod values (@idd , @pricee) 
    print ' cannot change' 
相關問題