Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Триггер и хранимая процедура не работают вместе  [new]
OxFord1988
Member

Откуда:
Сообщений: 4
Всем привет, не пойму почему не срабатывает.

Есть 3 таблицы: Income,IncomeDetails,Stock. При внесении новой записи в таблицы Income(Приход) и IncomeDetails(Детализация прихода), должна производиться запись в таблицу Stock(Остатки). Запись в две первые таблицы должна производится с помощью сообщения из xml файла. Т.е. база получает информацию из xml (с помощью хранимой процедуры, которая будет вытаскивать инфу из xml), потом вносит её в таблицы Income, IncomeDetails и автоматически делается запись в Stock(должен срабатывать триггер при внесении новой записи в IncomeDetails), увеличивая остатки. Проблема в том, что по отдельности триггер и процедура работают. Если тупо внести записи с помощью INSERT INTO, то срабатывает триггер. Если выполнить процедуру, данные xml записываются в таблицы, но триггер не срабатывает.

---Таблицы

CREATE TABLE Income
(ID INT NOT NULL,
 Date CHAR (50) NOT NULL,
 StorageID INT NOT NULL,
 SellerID INT NOT NULL,
CONSTRAINT PK_IDincome PRIMARY KEY (ID))
GO

CREATE TABLE IncomeDetails
(ProductID INT NOT NULL,
 Qty INT NOT NULL,
 Price MONEY NOT NULL,
 Sum MONEY NOT NULL,
 ID INT NOT NULL)
GO

CREATE TABLE Stock
(ProductID INT NOT NULL,
 StorageID INT NOT NULL,
 Qty INT NULL,
 Sum MONEY NOT NULL)
GO

---Триггер

CREATE TRIGGER PlusIncome3
ON IncomeDetails
FOR INSERT
AS
BEGIN
MERGE Stock AS s 
USING (SELECT inc.storageID,i.productID,SUM(i.qty) AS qty,SUM(i.sum) AS sum
 FROM inserted i JOIN Income inc ON i.ID=inc.ID GROUP BY i.ProductID,inc.StorageID) AS ins
 ON (ins.productID=s.productID AND ins.storageID=s.storageID)
 WHEN NOT MATCHED THEN
 INSERT (ProductID,StorageID,Qty,Sum) VALUES
 (ins.productID,ins.StorageID,ins.Qty,ins.Sum)
 WHEN MATCHED THEN 
 UPDATE 
 SET Qty= s.qty + ins.qty, sum=s.sum + ins.sum
 ;
END

---Процедура
CREATE PROCEDURE Income_Procedure (@xmlIncome xml)
AS 
insert into IncomeDetails select
Line.value('@ProdID', 'int') as ProductID,
Line.value('@Count', 'int') as Qty,
Line.value('@Price', 'MONEY') as Price,
Line.value('@Sum', 'MONEY') as Sum,
Line.value('@Dnum', 'int') as ID
FROM
@xmlIncome.nodes('/Doc/Line') col(Line);
insert into Income
 select
 Doc.value('@Num', 'int') AS ID,
 Doc.value('@DocDate', 'char(50)') AS Date,
 Doc.value('@StorageID', 'int'),
 Doc.value('@SellerID', 'int')
 From
@xmlIncome.nodes('/Doc') col(Doc)
    ;
GO

---Образец выполнения процедуры
EXECUTE Income_Procedure @xmlIncome='<Doc Num="1" DocDate="2017.10.10" StorageID="3" SellerID="3">
                <Line ProdID="5" Count="6" Price="25.10" Sum="200" Dnum="1"/>
                <Line ProdID="5" Count="6" Price="25.10" Sum="200" Dnum="1"/>
                <Line ProdID="4" Count="3" Price="10" Sum="30" Dnum="1"/></Doc >'


Сообщение было отредактировано: 27 май 17, 12:07
27 май 17, 09:54    [20516734]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и хранимая процедура не работают вместе  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
В триггере
FROM inserted i JOIN Income
А в процедуре
insert into IncomeDetails
...
insert into Income

Поэтому и не работает - на момент срабатывания триггера, в Income сответствующих строк еще нету.
27 май 17, 11:42    [20516822]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и хранимая процедура не работают вместе  [new]
OxFord1988
Member

Откуда:
Сообщений: 4
invm,
Получается процедура должна вносить необходимые строки для срабатывания триггера, но триггер не срабатывает так как необходимых строк ещё нет.
Можно ли в таком случае соединить триггер и хранимую процедуру? Как указать в процедуре необходимые действия для внесения данных в Stock?
27 май 17, 12:11    [20516847]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и хранимая процедура не работают вместе  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
OxFord1988
Можно ли в таком случае соединить триггер и хранимую процедуру?
Не надо ничего соединять.
В процедуре поменяйте местами insert into Income и insert into IncomeDetails.
27 май 17, 12:35    [20516866]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и хранимая процедура не работают вместе  [new]
OxFord1988
Member

Откуда:
Сообщений: 4
invm,
Спасибо, теперь работает.
27 май 17, 15:34    [20517064]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и хранимая процедура не работают вместе  [new]
aleks2
Guest
invm
OxFord1988
Можно ли в таком случае соединить триггер и хранимую процедуру?
Не надо ничего соединять.
В процедуре поменяйте местами insert into Income и insert into IncomeDetails.

Идиотский совет.

Триггера надо учиться писать.
И писать так, чтобы им было пофиг "в каком порядке вставляют".

А если не пофиг - нефиг триггер писать.
27 май 17, 16:57    [20517153]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и хранимая процедура не работают вместе  [new]
invm
Member

Откуда: Москва
Сообщений: 9116
aleks2
Идиотский совет.

Триггера надо учиться писать.
Дарагуля, когда же до тебя, "великого гуры", наконец-то дойдет, что пытаясь учить других тому, в чем сам не особо смыслишь, сам себя идиотом и выставляешь?
А может тебе это просто нравится?
27 май 17, 17:34    [20517177]     Ответить | Цитировать Сообщить модератору
 Re: Триггер и хранимая процедура не работают вместе  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7392
Если бы в IncomeDetails был внешний ключ на Income проблемное место бы выявилось само собой.
29 май 17, 10:28    [20519212]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить