Триггер, который обновляет только вставленную строку - PullRequest
13 голосов
/ 24 января 2012

Я пытаюсь создать простой триггер, используя TSQL (или SQL Server 2008).Проблема в том, что мой текущий триггер обновляет всю таблицу.Некоторое время это было хорошо, но теперь в таблице более 20 тысяч строк.Поэтому я хочу триггер, который обновляет только строки, которые вставляются.

Вот мой текущий простой триггер:

CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
FOR INSERT
AS
Begin
 Update Persons
    set MyFile = NULL
    where Len(MyFile) < 60
End

Я думаю, мне придется использовать либо «вставленную» таблицу, либо функцию row_number, упорядоченную по первичному ключу.Есть идеи?

Ответы [ 2 ]

20 голосов
/ 24 января 2012

Если здесь вообще необходимо использовать триггер, я бы использовал триггер INSTEAD OF, чтобы настроить значения перед вставкой и избежать необходимости JOIN возвращаться в базовую таблицу и обновлять их впоследствии.

CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
INSTEAD OF INSERT
AS
  BEGIN
      INSERT INTO Persons
      SELECT foo,
             bar,
             CASE
               WHEN Len(MyFile) >= 60 THEN MyFile
             END
      FROM   Inserted
  END  
17 голосов
/ 24 января 2012

Вам необходимо присоединиться к псевдотаблице Inserted в вашем выражении UPDATE. Всегда помните, что SQL Server запускает триггер один раз для оператора , и этот оператор может очень хорошо изменить / вставить несколько строк одновременно - так что ваша таблица Inserted, скорее всего, будет содержать больше одна строка - просто нужно помнить об этом при написании триггера.

Попробуйте что-то вроде этого:

CREATE TRIGGER trig_MyPplUpdate
ON [Persons]
FOR INSERT
AS
    UPDATE dbo.Persons
    SET MyFile = NULL
    WHERE Len(MyFile) < 60
    AND PersonID IN (SELECT DISTINCT PersonID FROM Inserted)

или используйте любой уникальный столбец (ваш первичный ключ), чтобы получить именно те строки, которые были вставлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...