it-swarm.com.de

Erstellen Sie einen Auslöser, der Werte in eine neue Tabelle einfügt, wenn eine Spalte aktualisiert wird

Ich habe mir hier einige Antworten zu Auslösern angesehen, kann aber nicht genau das finden, was ich brauche, aber ich bin mir sicher, dass meine Frage bereits gestellt/beantwortet wurde.

Ich versuche, alle Änderungen an columnA und columnB in Tabelle1 zu verfolgen.

Wenn sich dieser Wert ändert, möchte ich die Werte nachverfolgen, indem Sie den vorhandenen Wert und den neuen Wert in eine andere Tabelle mit Datum einfügen.

Ich habe mir so etwas für die Einfügung angesehen, wusste aber nicht, wie man die vorhandenen und neuen Werte der Quelltabelle (table1) hinzufügt:

CREATE TRIGGER NewTrigger ON table1
FOR INSERT
AS

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

go

Ich muss (denke ich) die 

Before update ON table1 FOR EACH ROW
   .
   .
   .
BEGIN

und alle Änderungen durchsehen und diese zuerst einfügen und dann nach dem Update dasselbe tun?

10
Standage

So etwas sollte tun, was Sie brauchen. Sie würden die Anweisungen INSERT unten einfügen, die die in MyLogTable ausgeführte Operation angeben. 

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

Wenn Sie möchten, können Sie der Protokolltabelle auch Spalten aus INSERTED und DELETED hinzufügen, wenn Sie die tatsächlichen Spaltenwerte erfassen möchten, die eingefügt oder aktualisiert wurden.

11
Darth Continent

Dies gilt für alle Änderungen und alle Spalten. Sie können jedoch ändern, wie Sie möchten:

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
5
jimdrang

trigger-Trigger für Bauchmuskeln erstellen
statt Update als

declare @idd int , @pricee money
  select @idd= ProductID from inserted 
  select @pricee = ListPrice from inserted 
  insert into prod values ( @idd , @pricee)
  print ' cannot change'
1
gowtham
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
0
user11130396