Итак, вам нужно узнать и использовать вставленные и удаленные коллекции в триггере. Ваш текущий триггер делает именно то, что вы говорите ... для каждой вставки и обновления, установите для всех значений MakeFlag значение 2, если они равны 1, во всей таблице. Нигде в вас нет ограничений на «только затронутые строки».
Так что вам действительно нужно что-то больше, как это:
CREATE TRIGGER trg_MakeFlag
ON Production.Product
AFTER INSERT, UPDATE AS
BEGIN
UPDATE p
SET MakeFlag = '2'
FROM Production.Product p
INNER JOIN inserted i ON p.ProductID = i.ProductID
WHERE MakeFlag = '1'
END
Здесь вы присоединяетесь таблица со вставленным коллекции (которые строки вставляются или значение «после обновления» после обновления) , чтобы влиять только на определенные строки, а не на все строки.
Конечно, все еще есть проблема. У вас есть триггер, который запускается после обновления в данной таблице, который затем обновляет эту таблицу ... что звучит как рекурсивный для меня. Наверное, не лучшая идея.
Возможно, вы захотите посмотреть на создание двух триггеров INSTEAD OF, один для вставок и один для обновлений, который в основном делает INSERT или UPDATE вставленной коллекции в таблицу, заменяя один столбец на 2, где он равен 1 (используя оператор CASE).
Это будет выглядеть примерно так:
CREATE TRIGGER trg_MakeFlag
ON Production.Product
AFTER INSERT AS
BEGIN
INSERT INTO Production.Product (ProductID, MakeFlag, column3, column4, etc...)
SELECT ProductID,
CASE WHEN i.MakeFlag = 1 THEN 2 ELSE i.MakeFlag END,
column3,
column4,
...
FROM inserted;
END
Вы бы перечислить все столбцы (положить настоящие имена там вместо колонка3, column4 и т.д ....) и убедитесь, вы выбираете все одинаковые столбцы в том же порядке, что и вы вставляете SELECT FROM. Оператор CASE делает магию преобразования каждого 1, вставленного в 2, оставляя все остальные значения в одиночку.
Вы сделали бы что-то подобное с триггером INSTEAD OF UPDATE.
Только некоторые идеи для вас, чтобы обдумать.
Вам необходимо опубликовать вашу схему. Каков первичный ключ для таблицы? – pmbAustin
Первичный ключ для этой таблицы - ProductID. – SMD