2015-02-11 2 views
0

я создаю После вставки триггера, его работает нормально, но у меня есть определенные условия, прежде чем выполнять операторы внутри триггераSql Trigger После вставки обновления другой таблицы с условиями

  1. , основанные на различном CUSTOMERID Запустить триггер , Я хочу проверить, какой CustomerId был вставлен в мою LoyaltyDetailsTable, скажем, если последняя вставка была Customerid = 2, тогда передайте это Customerid в том случае, когда условие запустило триггер, или если Customerid = 1, тогда запустите триггер для этого Id, и так далее ,
  2. Я хочу проверить, есть ли в PriceClaimTable вставленный CustomerId, или нет. Если существует, то обновите информацию еще раз, просто вставьте значения только в LoyaltyDetailsTable.

Trigger запрос

CREATE TRIGGER DetailsAfterInsert ON [dbo].[LoyaltyDetailsTable] 
FOR INSERT 

as 

UPDATE PriceClaimTable 
SET CurrentPoints = 
( 
(SELECT SUM(LoayaltyPointsTable.Points) AS RecentPoints FROM LoayaltyPointsTable 
join LoyaltyDetailsTable ON LoayaltyPointsTable.LoyaltyPointsId 
= LoyaltyDetailsTable.LoyaltyPointsId 
WHERE CustomerId=1 and LoyaltyDetailsId= (SELECT MAX(LoyaltyDetailsId) 
AS LoyaltyDetailsTable FROM LoyaltyDetailsTable)) 

+ 

(SELECT CurrentPoints FROM PriceClaimTable WHERE ClaimCustomerId=1 and 
PriceClaimId=(SELECT max(PriceClaimId) FROM PriceClaimTable 
)) 

) 
WHERE ClaimCustomerId=1 and PriceClaimId=(SELECT max(PriceClaimId) FROM PriceClaimTable) 

Это моя первая попытка написать триггер, и here является структура таблицы.

Любая помощь будет отличной.

+0

Какую часть этого вы возникли проблемы с? –

+1

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

ответ

1

Что вы ищете, это таблица inserted. Каждый раз, когда вы выдаете оператор UPDATE, SQL Server генерирует две виртуальные таблицы с именем inserted и deleted, которые хранят информацию об изменениях данных, которые вы делаете. Эти таблицы доступны с вашего триггера. Для получения дополнительной информации см. Здесь: https://msdn.microsoft.com/en-us/library/ms191300.aspx

Вы можете использовать inserted, чтобы получить идентификаторы, которые вы ищете. Таким образом, вместо того, чтобы:

WHERE ClaimCustomerId=1 

вы можете использовать:

WHERE ClaimCustomerId=inserted.ClaimCustomerId 
+0

привет, это была хорошая идея, из [здесь] (http://stackoverflow.com/questions/4404219/sql-server-trigger-on-insert-and-how-to-reference-the-data-that-was -Inerted), я изменил на WHERE CustomerId = (выберите CustomerId из INSERTED), но я получаю ошибку as'Invalid имя объекта 'INSERTED'. ' – stom

+0

Огромное вам спасибо за то, что вы указали мне, что я искал одно слово «вставленный», и это сделало решение ошибкой: «Недопустимое имя объекта« INSERTED ». было разрешено, когда я узнал, что вставленные прогоны выполняются только тогда, когда вставка происходит в таблице. Мне удалось выполнить все правильно, иногда ваше одно слово обучает нас здесь в stackoverflow, поэтому не переставайте отвечать, если у вас есть только маленькие слова, которые можно превратить в решения. Оцените свои усилия. – stom

Смежные вопросы