2016-10-12 7 views
0

Я пытаюсь создать триггер, который заменит конкретное значение, вставленное в конкретный столбец с другим конкретным значением.Создание триггера, который заменяет нуль определенным значением после вставок

Ex. Каждый раз, когда вставлен «1», «2» займет свое место после вставки и обновления.

Этот триггер заканчивает обновление каждой строки в столбце на «2» после того, как новый вставки, а не только новой строки, которая была вставлена:

CREATE TRIGGER trg_MakeFlag 
ON Production.Product 
AFTER INSERT, UPDATE AS 
    BEGIN 
    UPDATE Production.Product 
    SET MakeFlag = '2' 
    WHERE MakeFlag = '1' 
END 

Любая помощь приветствуется.

+0

Вам необходимо опубликовать вашу схему. Каков первичный ключ для таблицы? – pmbAustin

+0

Первичный ключ для этой таблицы - ProductID. – SMD

ответ

0

Итак, вам нужно узнать и использовать вставленные и удаленные коллекции в триггере. Ваш текущий триггер делает именно то, что вы говорите ... для каждой вставки и обновления, установите для всех значений 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.

Только некоторые идеи для вас, чтобы обдумать.

+0

Спасибо! Это было очень полезно. – SMD

+0

Тогда, пожалуйста, отметьте это как ваш ответ. Спасибо. – pmbAustin