2013-11-19 2 views
0

Добрый день. Я пытаюсь создать внутренний триггер в SQL Server. Я хотел бы, чтобы триггер выполнялся на основе обновленного изменения текста внутри столбца. Я бы хотел, чтобы в столбце менялись условия. Например, я хочу, чтобы триггер активировался, когда (имя столбца) изменяется от Scheduled до Queued или наоборот. Если столбец изменяется на Complete или на другой текст; Я не хочу, чтобы срабатывал триггер.Sql Server Update Trigger в столбце

Мой код выглядит следующим образом. Спасибо

ALTER TRIGGER [WIP].[Trigger] ON [WIP].[Roaster] 
AFTER INSERT, update, delete 
AS 
    if update (roastprofile) 
     select status 
     from wip.Roaster 
     where status = 'scheduled' and status != 'Complete' and status = 'Queued' 

     update controls.TriggerUpdate 
     set TriggerNumber = triggernumber + 1 

ответ

4

Добрый вечер,

мне было интересно о вашей логике.

Во-первых, вы ищете только обновления, исправьте? Если это так, удалите FOR INSERT и DELETE из определения триггера.

Во-вторых, поскольку вы новичок в триггерах, я оставил их, чтобы научить вас вставленным и удаленным таблицам. A delete имеет только непустую удаленную таблицу и Вставка содержит только непустую вставленную таблицу.

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

http://technet.microsoft.com/en-us/library/ms191300.aspx

В-третьих, пожалуйста, чтобы не назвать на спусковой крючок резервного слово триггера.

В-четвертых, я не понимаю, как запускается roastprofile. Вы просто ищете обновления, которые отображают статус между двумя выбранными парами. Когда эта комбинация встречается, вы хотите обновить триггер.

И последнее, но не менее важное: удаленные и вставленные таблицы могут иметь несколько записей. Вам нужно будет присоединиться к ним по ключевому значению (pk). Я добавил гипотетический., Который вам нужно будет изменить.

Кроме того, я сохранил результаты присоединения записей и тестирования для комбинации во временную таблицу. Затем эта таблица запрашивается, а номер запуска обновляется количеством обращений.

Я не знаю, соответствует ли это вашей бизнес-логике; однако он исправляет недостатки, которые я видел в вашем дизайне.

-- Delete the existing trigger. 
IF EXISTS (select * from sysobjects where id = object_id('CustomCode')and type = 'TR') 
    DROP TRIGGER [WIP].[CustomCode] 
GO 

-- Create the new trigger. 
CREATE TRIGGER [WIP].[CustomCode] on [WIP].[Roaster] 
FOR INSERT, UPDATE, DELETE NOT FOR REPLICATION 
AS 

BEGIN 

    -- declare local variable 
    DECLARE @MYMSG VARCHAR(250); 
    DECLARE @MYCNT INT; 


    -- nothing to do? 
    IF (@@rowcount = 0) RETURN; 

    -- do not count rows 
    SET NOCOUNT ON; 

    -- deleted data 
    IF NOT EXISTS (SELECT * FROM inserted) 
     BEGIN 
      SET @MYMSG = 'DELETE ACTION' 
      RETURN; 
     END 

    ELSE 
     BEGIN 

      -- inserted data 
      IF NOT EXISTS (SELECT * FROM deleted) 
      BEGIN   
       SET @MYMSG = 'INSERT ACTION' 
       RETURN; 
      END 

      -- updated data 
      ELSE 
      BEGIN 
       SET @MYMSG = 'UPDATE ACTION' 

       -- get the status before and after 
       SELECT 
        CASE 
         WHEN LOWER(del.status) = 'scheduled' AND LOWER(ins.status) = 'queued' THEN 1 
         WHEN LOWER(del.status) = 'queued' AND LOWER(ins.status) = 'scheduled' THEN 1 
         ELSE 0 
        END AS FLAG 
       INTO 
        #MyTemp 
       FROM 
        inserted as ins JOIN deleted as del ON ins.id = del.id; 

       -- Total number of conditions satisfied 
       SELECT @MYCNT = SUM(FLAG) FROM #MyTemp; 

       -- your business logic 
       update controls.TriggerUpdate 
       set TriggerNumber = TriggerNumber + @MYCNT; 


      END 

      RETURN; 
     END 

END 
GO 
+0

Благодарим за помощь и указатели. Я ценю конструктивный совет. Код работает так, как должен, для моей ситуации. Еще раз спасибо. – ENGR024

+0

Так же, как и в стороне, это одна из самых приятных презентаций кода триггера и показывает три возможных ветви, которые я видел во множестве примеров «как написать триггер». –