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

Откуда:
Сообщений: 17
Добрый день, это продолжение этой темы https://www.sql.ru/forum/1148278/zadanie-dlya-soiskatelya-proshu-pomoch.

Решил создать таблицу остатков в которую бы записывались остатки по товарам на конкретном складе.

Чтобы изменять(добавлять) остатки на склад есть триггер. Но он работает некорректно. Прошу помочь разобраться почему.
Но для начала таблички.

Таблица прихода
CREATE TABLE [dbo].[Prihod](
	[icdPrihod] [int] NOT NULL,
	[Num] [int] NOT NULL,
	[DocDate] [datetime] NOT NULL,
	[StorageID] [int] NOT NULL,
	[SellerID] [int] NOT NULL,
 CONSTRAINT [PK_Prihod] PRIMARY KEY CLUSTERED 
(
	[icdPrihod] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


Таблица детализации прихода
CREATE TABLE [dbo].[DetPrihod](
	[icdDetPrihod] [int] IDENTITY(1,1) NOT NULL,
	[icdPrihod] [int] NOT NULL,
	[Num] [int] NOT NULL,
	[ProdID] [int] NOT NULL,
	[Count] [int] NOT NULL,
	[Price] [float] NOT NULL,
	[Sum] [float] NOT NULL,
 CONSTRAINT [PK_DetPrihod] PRIMARY KEY CLUSTERED 
(
	[icdDetPrihod] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[DetPrihod]  
WITH CHECK ADD  CONSTRAINT [FK_icdPrihod_icdPrihod]
FOREIGN KEY([icdPrihod])
REFERENCES [dbo].[Prihod] ([icdPrihod])
GO
ALTER TABLE [dbo].[DetPrihod] CHECK CONSTRAINT [FK_icdPrihod_icdPrihod]
GO


Таблица остатков
CREATE TABLE [dbo].[Ostatki](
	[icdTovar] [int] NOT NULL,
	[icdSklad] [int] NOT NULL,
	[Col] [int] NOT NULL,
	[Summa] [float] NOT NULL
) ON [PRIMARY]

GO


А вот триггер
CREATE TRIGGER	RASCHETOSTATKOV
ON tempdb.dbo.DetPrihod
FOR INSERT AS
DECLARE @x INT, @y INT, @s INT, @z FLOAT
BEGIN
--если запись о поставленном товаре еще нет,
--то добавляется запись в таблицу остатков
 IF NOT EXISTS ( SELECT distinct icdSklad, icdTovar  FROM Ostatki O, inserted i
				WHERE O.icdTovar=i.ProdID or O.icdSklad in 
									 (Select distinct StorageID 
									  from tempdb.dbo.prihod vv , tempdb.dbo.DetPrihod gg 
											  where vv.icdPrihod=gg.icdPrihod))
          INSERT INTO Ostatki ([icdTovar],[icdSklad],[Col],[Summa])
			select det.ProdID, pr.StorageID,det.count, det.sum
			from detPrihod as det, prihod as pr
			where pr.icdPrihod=det.icdPrihod
  ELSE
--если запись о товаре уже была в таблице 
--Остатки, то определяется код и количество 
--товара из добавленной в таблицу Детализация прихода записи

	BEGIN
		SELECT @y=i.ProdID, @s=p.StorageID, @x=i.Count, @z=i.Sum
		FROM Ostatki, inserted i, Prihod p
		WHERE Ostatki.icdTovar=i.ProdID and Ostatki.icdSklad = p.StorageID
--и производится изменения количества товара в
--таблице Oстатки
         UPDATE Ostatki
         SET [Col]=[Col]+@x
  --       SET [Summa]=[Summa]+@z;
         WHERE icdTovar=@y and icdSklad=@s
    END
END


Триггер не отрабатывает корректно.
При первой вставке записи в таблицу прихода и детализации прихода запись в таблицу остатков добавляется.
INSERT INTO tempdb.dbo.Prihod
VALUES (1,1,'2010-10-20 00:00:00',1,1)
--VALUES (2,1,'2010-10-20 00:00:00',2,1)
--VALUES (3,1,'2010-10-20 00:00:00',3,1)

INSERT INTO tempdb.dbo.DetPrihod
VALUES (1,2,1,10,35.3, 70.6)
--VALUES (2,2,1,20,35.3, 70.6)
--VALUES (3,3,3,10,35.3, 70.6)


Если далее вставлять записи с ProdID(идентификатор товара) отличающемся от первого то запись в таблицу остатков не добавляется.
Если вставлять запись с тем же идентификатором товара, но с иным идентификатором склада (StorageID) то количество суммируется к существующему к существующему количеству товара и идентификатор склада игнорируется. А надо бы чтобы добавлялась запись с остатками товара для нового склада.
Если вставлять записи с идентификаторами товара и склада отличными от первого запись так же не добавляется.
Видимо условие не отрабатывает корректно.
WHERE O.icdTovar=i.ProdID or O.icdSklad in 
									 (Select distinct StorageID 
									  from tempdb.dbo.prihod vv , tempdb.dbo.DetPrihod gg 
											  where vv.icdPrihod=gg.icdPrihod))

Подскажите как нужно модифицировать триггер чтобы при вставке новой записи для нового склада добавлялась запись в таблицу остатков.
4 апр 15, 19:35    [17474025]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
ХП,
Guest
stajooor
IF NOT EXISTS ( SELECT distinct icdSklad, icdTovar  FROM Ostatki O, inserted i
				WHERE O.icdTovar=i.ProdID or O.icdSklad in 
									 (Select distinct StorageID 
									  from tempdb.dbo.prihod vv , tempdb.dbo.DetPrihod gg 
											  where vv.icdPrihod=gg.icdPrihod))

а что, ваще, это условие делает?
... и что такое JOIN-ы ты знаешь?
не пишут щаз так
		FROM Ostatki, inserted i, Prihod p
		WHERE Ostatki.icdTovar=i.ProdID and Ostatki.icdSklad = p.StorageID

а пишут так
FROM Ostatki inner join inserted i on Ostatki.icdTovar=i.ProdID 
inner join Prihod p on Ostatki.icdSklad = p.StorageID
и это уже давно не "вопрос вкуса" ...

триггер твой типа такого должен быть
CREATE TRIGGER	RASCHETOSTATKOV
ON tempdb.dbo.DetPrihod
FOR INSERT AS
BEGIN
	--	обновление существующих
	update O
	set			 O.[Col]=O.[Col]+i.[Count]
				,O.[Summa]=O.[Summa]+i.[Sum]
	from		prihod as pr
	inner join	inserted as i	on pr.icdPrihod=i.icdPrihod
	inner join	Ostatki O		on O.icdTovar=i.ProdID and O.icdSklad=pr.StorageID

	--	запись новых	
	insert into Ostatki (icdTovar, icdSklad, Col, Summa)

	select		i.ProdID, pr.StorageID, i.[Count], i.[Sum]  
	from		prihod as pr
	inner join	inserted as i	on pr.icdPrihod=i.icdPrihod
	left join	Ostatki O		on O.icdTovar=i.ProdID and O.icdSklad=pr.StorageID
	where	O.icdTovar is null 

END

Если версия сервера >=2008, то это делается одной командой MERGE

Вот эти "разноименнованные" поля PK/FK даа и просто "односмысловые", в разных таблицах - это просто пц !
Только из-за этого тебя уже никто ни на какое собеседование не позовёт :)
я об этом, если не понял
icdTovar <===> ProdID
icdSklad <===> StorageID
Count <===> Col
Sum <===> Summa

Ну и "мякотка" :)
НЕ НУЖЕН ТУТ ТРИГГЕР !!!1 ОН ТУТ ВРЕДЕН !!!
У документа (приход/расход) должно быть поле Статус (0 / 1, в простейшем случае ).
Пока менегер "набивает" эту накладную, Статус - 0, и документ никак на остатки не влияет.
После того, как он всё что хотел "набил", он устанавливает "Статус"=1, и при этом выполняется ХП, которая "двигает" остатки. Только так!

это я уже не говорю, про то, что "остатки" в таком виде, лучше делать на какую-то дату, и эти остатки - не трогают.
и кроме таблицы Остатков на дату, вводят таблицу ДвиженияПоДокументам (idDoc, idStorage, idProd, [Count], [Sum] ), фактические остатки, получают по этим двум таблицам.
4 апр 15, 21:01    [17474191]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
aleks2
Guest
Бред.

CREATE TRIGGER	RASCHETOSTATKOV
ON tempdb.dbo.DetPrihod
FOR INSERT AS
BEGIN

 merge Ostatki as o
   using (select sum(i.Col) as col, sum(i.Summa) as summa, i.icdTovar, p.icdSklad 
            from inserted i 
                 inner join Prihod p on p.icdPrihod = i.icdPrihod
            group by i.icdTovar, p.icdSklad 
          ) as new
   on ( o.cdTovar = new.cdTovar and o.icdSklad = new.icdSklad )
   when not matched then
     insert([icdTovar],[icdSklad],[Col],[Summa]) values(new.icdTovar, new.icdSklad, new.col, new.summa)
   when matched then
     update set [Col] = [Col] + new.Col, [Summa] = [Summa] + new.summa
 ;
 
end; 
4 апр 15, 21:04    [17474194]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
stajooor
Member

Откуда:
Сообщений: 17
ХП, aleks2 благодарю!
5 апр 15, 14:46    [17475665]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
stajooor
Member

Откуда:
Сообщений: 17
Пытаюсь создать триггер для таблиц детализации расхода.
В момент расхода должен производиться контроль на отрицательный остаток, в случае если хоть по одной позиции будет отрицательный остаток, транзакция должна быть отменена с ошибкой. В пояснение ошибки должны быть указаны причины отмены транзакции.
При расходе списывается указанное количество в детализации "Расхода". Сумма списывается по средней цене. То есть "Сумма к списанию = Количество в расходе * (Остаток суммы на складе/Количество остатка товара на складе)


Модифицировал триггер для детализации прихода, но он некорректно отрабатывает.
CREATE TRIGGER	RASCHETOSTATKOV
ON tempdb.dbo.DetPrihod
FOR INSERT AS
BEGIN
--контроль на остаток товара на складе
if exists (
select i.ProdID, pr.StorageID, (i.[Count]-O.[Col]) as ost
			from		prihod as pr
			inner join	detPrihod as i	on pr.icdPrihod=i.icdPrihod
			left join	Ostatki O		on O.icdTovar=i.ProdID and O.icdSklad=pr.StorageID
			where (i.[Count]-O.[Col])<0	 or (O.icdTovar is null)
			)
BEGIN
       ROLLBACK TRAN
       PRINT 'откат товара нет '
END
--если контроль не отработал то обновляем остатки. 
merge Ostatki as o
   using (select sum(i.Count) as [Count], sum(i.Sum) as [Sum], i.ProdID, p.StorageID 
            from inserted i 
                 inner join Prihod p on p.icdPrihod = i.icdPrihod
            group by i.ProdID, p.StorageID 
          ) as new
   on ( o.icdTovar = new.ProdID and o.icdSklad = new.StorageID )
   when matched then
   update set [Col] = [Col] - new.[Count], [Summa] = new.[Count]*([Summa]/[Col])
 ;

end;

Подскажите почему не отрабатывает контроль на остаток? Всегда пишет в табличку остатков, в минус.
5 апр 15, 21:39    [17476627]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34620
stajooor,

[Count] [int] NOT NULL,
[Price] [float] NOT NULL,
[Sum] [float] NOT NULL,


мужчина, ты очень хорошо подумал о том, что делаешь?
6 апр 15, 02:44    [17477031]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
ХП,
Guest
stajooor,

автор
where (i.[Count]-O.[Col])<0
не оттуда вычитаешь
наоборот нужно
where (O.[Col]-i.[Count])<0


и если это триггер на "приход"
автор
CREATE TRIGGER	RASCHETOSTATKOV
ON tempdb.dbo.DetPrihod

то какое вычитание? Приход должен увеличивать остатки
6 апр 15, 09:15    [17477258]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
Glory
Member

Откуда:
Сообщений: 104760
stajooor
Подскажите почему не отрабатывает контроль на остаток?

Почему вы решили, что он не отрабатывает ?
Наверное потому, что по вашему мнению ROLLBACK TRAN или PRINT должны прервать выполнение триггера ?
6 апр 15, 09:31    [17477284]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
stajooor
Member

Откуда:
Сообщений: 17
ХП,
stajooor,
то какое вычитание? Приход должен увеличивать остатки


Это я просто чтобы новую табличку не создавать в tempdb оставил. Потому что структура такая же. А так, да по логике DetRashod будет когда всё протестирую в tempdb.

Glory
Почему вы решили, что он не отрабатывает ?
Наверное потому, что по вашему мнению ROLLBACK TRAN или PRINT должны прервать выполнение триггера ?


Ход мысли такой: если сработает условие if exists, то транзакция должна откатиться и выдать сообщение. А если условие не выполняется, то остатки товара на складе уменьшаются путем обновления.

[Count] [int] NOT NULL,
[Price] [float] NOT NULL,
[Sum] [float] NOT NULL,
мужчина, ты очень хорошо подумал о том, что делаешь?


Да, потому что это тестовое задание и я в xml всегда буду подавать эти значения)
6 апр 15, 19:01    [17480544]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
stajooor
Member

Откуда:
Сообщений: 17
Переделал так, но почему то постоянно, при любых значениях, отрабатывает Rollback TRAN, он видимо не видит условие if exists. Как сделать так чтоб увидел?
CREATE TRIGGER	RASCHETOSTATKOV
ON tempdb.dbo.DetPrihod
FOR INSERT AS
BEGIN
if 1=1
begin
if exists (
select i.ProdID, pr.StorageID, (O.[Col]-i.[Count]) as ost
			from		prihod as pr
			inner join	detPrihod as i	on pr.icdPrihod=i.icdPrihod
			left join	Ostatki O		on O.icdTovar=i.ProdID and O.icdSklad=pr.StorageID
			where (O.[Col]-i.[Count])<0	 or (O.icdTovar is null)
			)
       ROLLBACK TRAN
END

else 
BEGIN
merge Ostatki as o
   using (select sum(i.Count) as [Count], sum(i.Sum) as [Sum], i.ProdID, p.StorageID 
            from inserted i 
                 inner join Prihod p on p.icdPrihod = i.icdPrihod
            group by i.ProdID, p.StorageID 
          ) as new
   on ( o.icdTovar = new.ProdID and o.icdSklad = new.StorageID )
   when matched then
   update set [Col] = [Col] - new.[Count], [Summa] = new.[Count]*([Summa]/[Col])
 ;
END
END;
6 апр 15, 19:06    [17480565]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
ХП,
Guest
stajooor,

тут (выделил) должна быть таблица inserted

stajooor
Переделал так, но почему то постоянно, при любых значениях, отрабатывает Rollback TRAN, он видимо не видит условие if exists. Как сделать так чтоб увидел?
CREATE TRIGGER	RASCHETOSTATKOV
ON tempdb.dbo.DetPrihod
FOR INSERT AS
BEGIN
if 1=1
begin
if exists (
select i.ProdID, pr.StorageID, (O.[Col]-i.[Count]) as ost
			from		prihod as pr
			inner join	detPrihod as i	on pr.icdPrihod=i.icdPrihod
			left join	Ostatki O		on O.icdTovar=i.ProdID and O.icdSklad=pr.StorageID
			where (O.[Col]-i.[Count])<0	 or (O.icdTovar is null)
			)
       ROLLBACK TRAN
END
6 апр 15, 19:22    [17480591]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
ХП,
Guest
и, к стате, твоё условие по ELSE (и соответственно запрос merge ) выполнится только тогда, когда 1 не будет равен 1, т.е. никогда
6 апр 15, 19:38    [17480627]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
stajooor
Member

Откуда:
Сообщений: 17
ХП,
stajooor,

тут (выделил) должна быть таблица inserted


Ах да, точно. Экспериментировал с запросами и забыл поменять... Спасибо!

Теперь по другому ведет себя триггер. Если подать количество большее чем есть на складе, то откатывает правильно. Но если меньшее то просто пишет в Детализацию, но остатки не обновляет. Наверно в merge проблема?
6 апр 15, 19:41    [17480641]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
stajooor
Member

Откуда:
Сообщений: 17
автор
и, к стате, твоё условие по ELSE (и соответственно запрос merge ) выполнится только тогда, когда 1 не будет равен 1, т.е. никогда


Спасибо!) Но вот как тогда переделать? В t-sql ведь нет конструкции if then else, а только if else?
6 апр 15, 19:43    [17480645]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
stajooor
Member

Откуда:
Сообщений: 17
Сделал так, теперь остатки уменьшаются). Спасибо.

CREATE TRIGGER	RASCHETOSTATKOV
ON tempdb.dbo.DetPrihod
FOR INSERT AS
BEGIN
if exists (
select i.ProdID, pr.StorageID, (O.[Col]-i.[Count]) as ost
			from		prihod as pr
			inner join	inserted as i	on pr.icdPrihod=i.icdPrihod
			left join	Ostatki O		on O.icdTovar=i.ProdID and O.icdSklad=pr.StorageID
			where (O.[Col]-i.[Count])<0	 or (O.icdTovar is null)
			)
       ROLLBACK TRAN
else 
BeGIN
merge Ostatki as o
   using (select sum(i.Count) as [Count], sum(i.Sum) as [Sum], i.ProdID, p.StorageID 
            from inserted i 
                 inner join Prihod p on p.icdPrihod = i.icdPrihod
            group by i.ProdID, p.StorageID 
          ) as new
   on ( o.icdTovar = new.ProdID and o.icdSklad = new.StorageID )
   when matched then
   update set [Col] = [Col] - new.[Count], [Summa] = new.[Count]*([Summa]/[Col])
 ;
END
END;
6 апр 15, 19:49    [17480665]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
aleks2
Guest
stajooor
Сделал так, теперь остатки уменьшаются). Спасибо.

CREATE TRIGGER	RASCHETOSTATKOV
ON tempdb.dbo.DetPrihod
FOR INSERT AS
BEGIN
if exists (
select i.ProdID, pr.StorageID, (O.[Col]-i.[Count]) as ost
			from		prihod as pr
			inner join	inserted as i	on pr.icdPrihod=i.icdPrihod
			left join	Ostatki O		on O.icdTovar=i.ProdID and O.icdSklad=pr.StorageID
			where (O.[Col]-i.[Count])<0	 or (O.icdTovar is null)
			)
       ROLLBACK TRAN
else 
BeGIN
merge Ostatki as o
   using (select sum(i.Count) as [Count], sum(i.Sum) as [Sum], i.ProdID, p.StorageID 
            from inserted i 
                 inner join Prihod p on p.icdPrihod = i.icdPrihod
            group by i.ProdID, p.StorageID 
          ) as new
   on ( o.icdTovar = new.ProdID and o.icdSklad = new.StorageID )
   when matched then
   update set [Col] = [Col] - new.[Count], [Summa] = new.[Count]*([Summa]/[Col])
 ;
END
END;


Что за бред ROLLBACK TRAN в триггере?
Гнать надо поганной метлой таких "программиЗдов".

if exists (
select i.ProdID, pr.StorageID, (O.[Col]-i.[Count]) as ost
			from		prihod as pr
			inner join	inserted as i	on pr.icdPrihod=i.icdPrihod
			left join	Ostatki O		on O.icdTovar=i.ProdID and O.icdSklad=pr.StorageID
			where (O.[Col]-i.[Count])<0	 or (O.icdTovar is null)
			)
       raiserror( 'Нема товару!!!'б 16, 1 )
7 апр 15, 07:58    [17481669]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
ХП,
Guest
aleks2,

без ROLLBACK-а в триггере, сохранятся строки в DetPrihod (в таблице, на которой триггер)
А у ТСа такая логика работы "системы" - если в DetPrihod появилась новая запись, то она СРАЗУ должна изменить остатки.
Я ему тут 17474191 писал, что это "херь" и так не делают
автор
НЕ НУЖЕН ТУТ ТРИГГЕР !!!1 ОН ТУТ ВРЕДЕН !!!
У документа (приход/расход) должно быть поле Статус (0 / 1, в простейшем случае ).
Пока менегер "набивает" эту накладную, Статус - 0, и документ никак на остатки не влияет.
После того, как он всё что хотел "набил", он устанавливает "Статус"=1, и при этом выполняется ХП, которая "двигает" остатки. Только так!
Но он хочет убедится в этом "на практике".
7 апр 15, 08:22    [17481708]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
Jaffar
Member

Откуда:
Сообщений: 633
ХП, Guest

ХП - здесь нахрен не нужна.
нужен тот же триггер только на поле Status - если изменился с 0 на 1 - то учесть движение товара в документе в остатках, если наоборот - то вычесть его из остатков.

Про таблицы - нужна таблица текущих остатков + таблица остатков по складу на дату/время.
7 апр 15, 08:23    [17481712]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
ХП,
Guest
Jaffar
ХП, Guest

ХП - здесь нахрен не нужна.
нужен тот же триггер только на поле Status - если изменился с 0 на 1 - то учесть движение товара в документе в остатках, если наоборот - то вычесть его из остатков.

Собстна, триггер - это та же ХП, только выполняемая по событию в БД.
Так что, вся суть вашего "предложения" - кто это "событие" будет генерировать.
Я - за то, что бы "генерировал" программист вызовом ХП в клиенте, вы - за то, что бы это делала БД, на вызов из клиента "Update ... set Status=..."
Только вот в любой сколько-нибудь серьёзной учётке, "прямые" UPDATE/INSERT/DELETE - будут закрыты, и придётся под это "Update ... set Status=..." - делать ХП! Так почему бы тогда всё не сделать в ХП? - и изменение остатков, БЕЗ триггера

Второе, это блокировка таб. пока выполняется триггер. Хорошо, если всё "изменение статуса"/"проведение" это только изменение остатков. А если при этом ещё нужно выполнить 100500 действий? нуу, например, "телеграмму дать" менеджеру по закупкам, что какого-то итема, на складе осталось меньше определённого кол-ва?

Третье - "неявное выполнение", "сложнее поддержка" - в общем субъективно, но на моё имхо - тоже важно.

Так что - только ХП
7 апр 15, 09:00    [17481805]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
ХП,
Guest
даа, есть ещё 4. - персонально ТС.
Ему в задании, ясно сказали :
4. Реализовать систему хранимых процедур, которые будут выполнять роль интерфейса между клиентской программой и серверной частью.
а он тут, с триггерами, "муму насилует" :)
7 апр 15, 09:05    [17481836]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
Jaffar
Member

Откуда:
Сообщений: 633
ХП,,

==> Только вот в любой сколько-нибудь серьёзной учётке, "прямые" UPDATE/INSERT/DELETE - будут закрыты

1.да-да расскажите это "нищему на улице" может он согласится.
2.Хотя ЭТО правильно - можно создать процедуру которая будет делать ЭТО и дать к ней доступ.


Используя триггер мы гарантируем "целостность" и согласованность данных.

С базой можно работать хоть откуда, хоть прямыми инсертами накидать приходных/расходных документов, и кто будет эту ХП вызывать для каждого документа?

А что табличка блокируется - то так и должно быть для сохранения целостности и согласованности данных.

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

Тогда уж и обеспечивайте целостность данных средствами вашего клиента и вообще зачем вам тогда БД?
пишите в текстовичок выложенный на шаре, сами организовывайте || работу и т.п.
7 апр 15, 10:48    [17482310]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
Jaffar
Member

Откуда:
Сообщений: 633
ХП vs Триггер

Ставлю вопрос на голосование уважаемого сообщества.
Какой в данном случае подход вам кажется правильный: Триггер или ХП?
Прошу голосовать.

Да yfxytncz holywar......
7 апр 15, 10:51    [17482326]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Jaffar,

если бы процедуры были бы всегда предпочтительны, можно было бы изъять триггеры из SQL.
Если бы всегда лучше было бы использовать триггеры, то надо было бы забыть про процедуры.

Однако, существуют и те, и другие.
Потому что в разных ситуациях нужен свой подход.
7 апр 15, 10:55    [17482364]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
ХП,
Guest
iap
Jaffar,

если бы процедуры были бы всегда предпочтительны, можно было бы изъять триггеры из SQL.
Если бы всегда лучше было бы использовать триггеры, то надо было бы забыть про процедуры.

Однако, существуют и те, и другие.
Потому что в разных ситуациях нужен свой подход.

Так, выскажитесь по данной, конкретной ситуации :)
7 апр 15, 11:28    [17482546]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на изменение остатков по товару и складу.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Jaffar
Какой в данном случае подход вам кажется правильный: Триггер или ХП?
Прошу голосовать.

Где мультиселект ?
7 апр 15, 11:29    [17482549]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить