обновление нескольких таблиц с помощью триггеров - SQL Server - PullRequest
1 голос
/ 03 декабря 2009

Мне нужно обновить таблицу A на основе вставок в таблицу B. Я создал триггер, который срабатывает, когда строка вставляется в tableB и просто копирует ее в tableA (это именно то, что я хочу). Но проблема возникает, когда я обновляю свои существующие записи в таблице B, строки в таблице A уже существуют с тем же первичным ключом.

чтобы справиться с этим, я попытался удалить существующую строку в таблице A, где первичный ключ соответствует обновленной строке, а затем просто вставить строку из «вставленной» таблицы. Но tsql просто не позволяет мне удалить меня из триггера и выдает ошибку, в которой говорится, что «многоэлементный идентификатор« INSERTED.Id »не может быть связан».

Вот что я пытаюсь выполнить по коду:

delete from dbo.CurrentItems where dbo.CurrentItems.CurrentItemId = INSERTED.Id
INSERT INTO CurrentItems
SELECT * FROM INSERTED
WHERE IsActive = 1

Есть идеи, ребята?

Ответы [ 3 ]

3 голосов
/ 03 декабря 2009

Почему вы не можете просто обновить существующие строки в TableA, когда ваши строки в TableB обновляются ?? ОБНОВЛЕНИЕ вместо УДАЛИТЬ / ВСТАВИТЬ.

У вас может быть триггер AFTER INSERT, который делает то, что вы хотите сейчас, плюс триггер AFTER UPDATE, который обновляет строки в TableA (вместо добавления новых).

3 голосов
/ 03 декабря 2009

В операторе DELETE FROM необходимо добавить псевдостол INSERTED в таблицы, над которыми вы работаете (в предложении FROM), например:

DELETE dbo.CurrentItems 
  FROM dbo.CurrentItems
     , INSERTED
 WHERE dbo.CurrentItems.CurrentItemId = INSERTED.Id

INSERT INTO CurrentItems
SELECT * FROM INSERTED
WHERE IsActive = 1

В качестве альтернативы, вы можете использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ:

DELETE dbo.CurrentItems 
  FROM dbo.CurrentItems CI
       INNER JOIN INSERTED I ON CI.CurrentItemId = I.Id
0 голосов
/ 03 декабря 2009

Вы сказали, что у вас есть триггер, который срабатывает, когда "строка вставлена ​​в таблицу B". Таким образом, у вас есть триггер для стрельбы по вставкам. Мне кажется, что у вас также есть триггер для обновления. Вы хотели, чтобы триггер срабатывал и на обновлениях? Если нет, удалите «Обновить» из определения триггера.

Randy

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