2012-03-29 15 views
8

Ho visto alcune risposte precedenti sui trigger qui ma non riesco a trovare ciò di cui ho bisogno esattamente, ma sono sicuro che la mia domanda è stata posta/ha risposto prima.Crea un trigger che inserisce valori in una nuova tabella quando una colonna viene aggiornata

Sto provando a tenere traccia di eventuali modifiche alla colonnaA e alla colonnaB nella tabella1.

Se questo valore cambia, voglio tenere traccia dei valori inserendo il valore esistente e il nuovo valore in una tabella diversa con una data.

Ho cercato a usare qualcosa di simile per l'inserto, ma non è sicuro come aggiungere ottenere i valori esistenti e nuovi della tabella di origine (Tabella 1):

CREATE TRIGGER NewTrigger ON table1 
FOR INSERT 
AS 

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

go 

ho bisogno di usare (I pensare) il

Before update ON table1 FOR EACH ROW 
    . 
    . 
    . 
BEGIN 

e guardare attraverso tutti i cambiamenti e inserire questi primi poi fare lo stesso dopo l'aggiornamento?

risposta

7

Qualcosa di simile dovrebbe fare quello che ti serve. Le istruzioni INSERT in basso inseriscono valori che indicano l'operazione eseguita in 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 

Se si volesse si potrebbe anche aggiungere le colonne da INSERTED e DELETED al vostro tavolo di log così se si voleva catturare i valori di colonna effettivi che ha ottenuto inseriti o aggiornati.

+1

applausi ok per la risposta Dò un'occhiata a questo e torno da te. – Standage

+1

Scusa se non volevo tenere traccia dei valori effettivi nei columm che sono stati inseriti o aggiornati, con che facilità è fatto? – Standage

+1

Ho una soluzione che funziona in base alla tua risposta quindi grazie !! – Standage

4

Questo è per tutti i cambiamenti e tutte le colonne, ma è possibile modificare il modo che ti piace:

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

Non sono bravo in sql, quindi faccio domande sily.È questa risposta cattura da tutte le tabelle presenti in DB o dobbiamo dare un nome di tabella particolare? – SpringLearner

+0

Questo è per un tavolo. Dovresti scrivere il tuo script dinamico per far funzionare il trigger su più/tutte le tabelle. – jimdrang

1

CREATE TRIGGER trigge su abs
invece di aggiornamento come

declare @idd int , @pricee money 
    select @idd= ProductID from inserted 
    select @pricee = ListPrice from inserted 
    insert into prod values (@idd , @pricee) 
    print ' cannot change' 
Problemi correlati