2016-07-08 3 views
1

Я новичок в SQL Server, и я пытаюсь создать простой триггер обновления, который записывает строку в промежуточную таблицу всякий раз, когда столбец ceu_amount обновляется с нуля до любого числа больше чем ноль.SQL Server INSERT в ПОСЛЕ ОБНОВЛЕНИЯ Триггер

От использования инструкций PRINT я знаю, что переменные содержат правильные значения для выполнения инструкции INSERT, но строки не вставлены.

Вы можете помочь?

CREATE TRIGGER [dbo].[TRG_Product_Function_Modified] ON [dbo].[Product_Function] 
AFTER UPDATE 
AS 
BEGIN 
SET NOCOUNT ON; 

    -- 
    -- Variable definitions 
    -- 
    DECLARE @product_code_new as varchar(31) 
    DECLARE @product_code_old as varchar(31) 

    -- 
    -- Check if the staging table needs to be updated. 
    -- 
    SELECT @product_code_new = product_code FROM Inserted where ISNULL(ceu_amount,0) > 0; 
    SELECT @product_code_old = product_code FROM Deleted where ISNULL(ceu_amount,0) = 0; 
     IF @product_code_new IS NOT NULL 
     AND @product_code_old IS NOT NULL 
      INSERT INTO Product_Function_Staging VALUES (@product_code_new,CURRENT_TIMESTAMP); 

END; 

ответ

-2

Попробуйте использовать этот

CREATE TRIGGER [dbo].[Customer_UPDATE] 
     ON [dbo].[Customers] 
AFTER UPDATE 
AS 
BEGIN 
     SET NOCOUNT ON; 

     DECLARE @CustomerId INT 
     DECLARE @Action VARCHAR(50) 

     SELECT @CustomerId = INSERTED.CustomerId  
     FROM INSERTED 

     IF UPDATE(Name) 
     BEGIN 
       SET @Action = 'Updated Name' 
     END 

     IF UPDATE(Country) 
     BEGIN 
       SET @Action = 'Updated Country' 
     END 

     INSERT INTO CustomerLogs 
     VALUES(@CustomerId, @Action) 
END 
+0

Я предлагаю редактировать это так, чтобы он ссылался на таблицы и столбцы OPs. Кроме того, 'if update' не заботится о значении обновления, только то, что столбец был установлен, поэтому я не думаю, что это будет работать в любом случае. –

0

Эта часть кода выглядит подозрительно ко мне ..

SELECT @product_code_new = product_code FROM Inserted where ISNULL(ceu_amount,0) > 0; 
    SELECT @product_code_old = product_code FROM Deleted where ISNULL(ceu_amount,0) = 0; 
     IF @product_code_new IS NOT NULL 
     AND @product_code_old IS NOT NULL 
      INSERT INTO Product_Function_Staging VALUES (@product_code_new,CURRENT_TIMESTAMP); 

выше будет работать нормально, если есть только одна строка обновляется, что, если существует более одного значения .. product_code по умолчанию будет иметь последнее значение

Вы можете изменить приведенную выше часть кода низкий

Insert into Product_Function_Staging 
select product_code ,CURRENT_TIMESTAMP from inserted where product_code is not null 
+0

Спасибо за подсказку ... Он работает! – Bing

0

Вы получите неопределенные значения @product_code_new, если есть больше чем один строки обновляются с ceu_amount> 0; Аналогично для @product_code_old, если несколько строк обновлены с помощью ceu_amount NULL или равно 0. Можете ли вы разместить некоторые данные образца?

0

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

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

CREATE TRIGGER [dbo].[TRG_Product_Function_Modified] ON [dbo].[Product_Function] 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO Product_Function_Staging 
    SELECT i.product_code, CURRENT_TIMESTAMP 
    FROM inserted i 
     JOIN deleted d ON i.product_code = d.product_code -- assuming product_code is unique 
    WHERE i.ceu_amount > 0 -- new value > 0 
     AND ISNULL(d.ceu_amount, 0) = 0; -- old value null or 0 
END; 

Я не уверен, где вам нужно проверить для нулей в ваших данных, поэтому я сделал наилучшее предположение в предложении where.

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