Добрый вечер,
мне было интересно о вашей логике.
Во-первых, вы ищете только обновления, исправьте? Если это так, удалите 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
Благодарим за помощь и указатели. Я ценю конструктивный совет. Код работает так, как должен, для моей ситуации. Еще раз спасибо. – ENGR024
Так же, как и в стороне, это одна из самых приятных презентаций кода триггера и показывает три возможных ветви, которые я видел во множестве примеров «как написать триггер». –