Вставить или обновить только конкретную запись с помощью триггера - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь вставить запись в таблицу B, если в Таблице A есть какое-либо Обновление / Вставка. Триггер должен вставить только запись в операторе вставки, а не все записи таблицы в Таблице A в Таблицу B.приветствуется.

Код работает нормально, но он пытается вставить все записи в таблицу A вместо только конкретной записи.

CREATE TRIGGER TestTrigger  
ON dbo.Test 
FOR INSERT,update 
as

  insert into dbo.TestBKP(ID, LastName, FirstName, Age, updatetime)
    select ID, LastName, FirstName, Age, getdate()
    from Test

  print 'Row Inserted';

GO

insert into dbo.Test values(1,'AAA','BBB',24)

Ожидание

Таблица dbo.TestBKP должна содержать только указанные выше значения вставки, а не все данные в значениях dbo.Test.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

При использовании триггеров (и предложения OUTPUT для операторов SELECT или MERGE) существует специальная таблица ключевых слов с именем inserted, которая содержит записи вставляемой или обновляемой таблицы отслеживания.Вам нужно ссылаться на эту таблицу, если вы просто хотите работать с этими записями, а не со всей таблицей отслеживания, как ваш пример (FROM dbo.Test).

CREATE TRIGGER TestTrigger ON dbo.Test 
    FOR INSERT, UPDATE
AS
BEGIN

    insert into dbo.TestBKP (
        ID, 
        LastName, 
        FirstName, 
        Age, 
        updatetime)
    select 
        ID, 
        LastName, 
        FirstName, 
        Age, 
        getdate()
    from 
        inserted AS I -- This "inserted" table is a copy of dbo.Test with only new/updated records

    print 'Row Inserted';

END

При кодировании UPDATE или DELETE Триггеры, есть еще одна специальная таблица ключевых слов с именем deleted, которая содержит удаленные строки (при запуске DELETE) или старые версии обновленных строк (при запуске UPDATE).

0 голосов
/ 13 февраля 2019

просто замените Test на Inserted в операторе выбора

CREATE TRIGGER TestTrigger ON dbo.Test
FOR INSERT
AS
     INSERT INTO dbo.TestBKP
     (ID, 
      LastName, 
      FirstName, 
      Age, 
      updatetime
     )
            SELECT ID, 
                   LastName, 
                   FirstName, 
                   Age, 
                   GETDATE()
            FROM **inserted**;
     PRINT 'Row Inserted';
GO

INSERT INTO dbo.Test
VALUES
(1, 
 'AAA', 
 'BBB', 
 24
);
...