2013-10-02 2 views
-2

Вот мой триггерMS SQL триггер вместо обновления ELSE можно выполнить оригинальный запрос?

Create TRIGGER [dbo].[tri_before_update] 
    ON [dbo].[test] 
    instead of update 
AS 
BEGIN 

SET NOCOUNT ON; 
if update (test_a) 
begin 
    *.. my update & insert query* 
end 
END 


create TRIGGER [dbo].[tri_before_update_price] 
    ON [dbo].[co_ticket] 
    instead of update 
AS 
BEGIN 
    SET NOCOUNT ON; 
    if update (t_price) 
    begin 
    insert into old_price_log (t_id,insert_time,process_id,old_t_price) 
     select i.t_id,getdate(),2,t_price 
     from Inserted i,co_ticket t where i.t_id = t.t_id 
    update t set t_price = i.t_price 
     from co_ticket t, inserted i 
     where t.t_id = i.t_id 
    end 
    else 
    begin 
    -- if update other then (t_price) then the update comand not execute. 
    -- example when i update t_cancel_flag or t_quantity and etc. end 
    END 

Этот триггер выполнять отлично, когда я обновить на колонке «test_a». ОДНАКО, когда я обновляю, кроме столбца «test_a», он не будет выполняться. Я знаю, что могу поместить команду «else», но я получил много столбцов. иногда обновляет два других столбца, иногда три или четыре столбца. Я не хочу обновлять все столбцы каждый раз. Возможно ли, что ELSE «выполнил оригинальный запрос»? Я пробовал много по-другому, но до сих пор не могу работать. :(Пожалуйста, помогите

+0

Вы определяете триггер «после», который условно сделает * только * вставку. Почему вы выбрали вместо этого триггер? –

+0

, потому что мне нужно чтобы сохранить существующее значение «test_a» в журнале перед его обновлением. Есть ли лучший способ? – user2838258

+3

Определить «Мне нужно сохранить существующее значение test_a» в журнале. Поместите точную структуру таблицы и точный T-SQL, который вы используйте вместе с примером использования. не описывайте проблему. –

ответ

0
create TRIGGER [dbo].[tri_on_update_price] 
    ON [dbo].[co_ticket] 
AS 
BEGIN 
    SET NOCOUNT ON; 
    if update (t_price) 
    begin 
    insert into old_price_log (t_id,insert_time,process_id,old_t_price) 
     select d.t_id, getutcdate(),2,d.price 
     from deleted d 
    END 
end 

Обыкновенное после запуска будет делать только то, что вы хотите: вставить журнал изменения цены, если цена была обновлена ​​Нет необходимости ВМЕСТО Вы должны смотреть в deleted.. pseudo-table, чтобы получить старую цену. Не сохраняйте местное время в базе данных.

+0

Могу ли я узнать что-нибудь, что я должен поставить выше «AS». Потому что, если я ничего не ставил, возникает ошибка, однако если я поставлю «после обновления», тогда iuz будет поддерживать новую цену. – user2838258

+0

ах! моя ошибка, поставьте «после обновления», тогда это сработает! я присоединяюсь к таблице, тогда следует обновить delete.price не o.price! Я узнаю что-то новое! «Удалено», это так полезно! Большое вам спасибо за эту двухдневную помощь! :) – user2838258

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