2016-05-03 2 views
0

Я просто получаю мои ноги мокрые с триггеров в SQL Server, и я борюсь с этой проблемой:Trigger в SQL Server: производный столбец на INSERT

Создать триггер, чтобы сделать: всякий раз, когда установлен пакет программного обеспечения на ПК персоналу, который устанавливает программное обеспечение, требуется только предоставить данные для пакета, tagnum и instdate. Столбец softcost необходимо обновить на основе пакета пакета.

CREATE TRIGGER software_on_install_fill_in 
ON software 
FOR INSERT, UPDATE 
AS 
    --declare the names and types of variables you will use 
    DECLARE @software_pack char(4), @software_tagnum char(5), 
      @software_datetime datetime, @software_softcost numeric(10,2) 
BEGIN 
    --set the variables to values 
    SET @software_pack = (SELECT software.PACK FROM software, inserted i) 
    SET @software_tagnum = (SELECT software.TAGNUM FROM software, inserted i) 
    SET @software_datetime = (SELECT software.INSTDATE FROM software, inserted i) 

    UPDATE software 
    --apply logic to auto update softcost column of inserted row 
    SET @software_softcost = (SELECT package.PACKCOST 
           FROM package, inserted i 
           WHERE SOFTCOST = @software_softcost) 
END 
GO 

-- Try a test case, which fails 
insert software(PACK, TAGNUM, INSTDATE) 
values('ac11', '32494', '9/14/1998 0:00:01') 
GO 

--Try to see if contents of the table have changed, also fails 
select * from software 

Я получаю следующее сообщение об ошибке:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

я думаю, что что-то не так с моим вставным заявлением, потому что сам триггер, кажется, выполнить должным образом. Правильно ли я это делаю?

Thanks

+1

вы не можете вымышленным есть только одна запись в 'inserted' или' deleted' таблицы. Эти две таблицы содержат записи, на которые влияют инструкции 'INSERT' или' UPDATE' или 'DELETE'. Вам нужно будет перезаписать триггер, чтобы обработать то, что «вставленный» – Squirrel

+1

может содержать несколько строк, поэтому вы не можете назначить его переменной. – ydoow

+0

«Я думаю, что что-то не так с моей инструкцией вставки ...» Инструкция вставки в порядке. Триггер выглядит ужасно. Вы получаете свою ошибку в каждой строке после '--set переменные до значений' –

ответ

1

В основном ваш триггер фактически ничего не делает. Он объявляет некоторые переменные, присваивает значения этим переменным, а именно.

Ваш триггер принимает значение inserted таблица содержит только одну строку. Это неправильно. inserted таблицы содержит все строки, пострадавший от вашего INSERT или UPDATE заявления

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

Поскольку у меня нет связанных с этим деталей схемы, я предположил, что ПК является PACK и пытается перезаписать триггер.

Во всяком случае, триггер должен выглядеть примерно так, что

CREATE TRIGGER software_on_install_fill_in 
ON software 
FOR INSERT, UPDATE 
AS 
BEGIN 

    UPDATE s 
    SET SOFTCOST = p.PACKCOST 
    FROM inserted i 
     INNER JOIN software s ON i.PACK = s.PACK 
     INNER JOIN package p ON i.PACK = p.PACK 

END