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

Откуда:
Сообщений: 94
Есть две таблицы: Оплата (КодОплаты, ДатаОплаты, СуммаОплаты, Остаток) и ОплатаОтгрузки (Код,КодОплаты, КодОтгрузки, СуммаОплаты).
На удаление записи из ОплатаОтгрузки отрабатывает тригер на обновление поля Остаток в табл.Оплата.

if exists (select count(*) from Оплата where КодОплаты in (select КодОплаты from deleted)
update Оплата set Остаток=СуммаОплаты-(select sum(СуммаОплаты) from ОплатаОтгрузки where КодОплаты=(select КодОплаты from deleted)

Проблема в том, когда удаляется запись в табл.Оплата и записи из ОплатаОтгрузки удаляются каскадом, клиент выдает ошибку Timeout.
Если выполнить запрос на удаление на сервере, ошибок не возникает.
Думаю, что в случае удаления записи из Оплата не может отработать update, но почему при удалении на сервере ошибок не возникает?
Как вообще лучше сделать такое удаление, чтобы можно было Остаток обновить?
Спасибо.
29 мар 16, 11:19    [18990048]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
Glory
Member

Откуда:
Сообщений: 104751
RodikK
клиент выдает ошибку Timeout.
Если выполнить запрос на удаление на сервере, ошибок не возникает.

Клиентская утилита ManagementStudio, которую вы называете "на сервере", просто ставит _ клиентский таймаут_ в бесконечность.
В отличии от вашей клиентской программы.
29 мар 16, 11:22    [18990066]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
iap
Member

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

скобки считать умеете?
Зачем в EXISTS COUNT(*)???

Подробнее не смотрел.
29 мар 16, 11:23    [18990074]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
RodikK
Member

Откуда:
Сообщений: 94
Glory
Клиентская утилита ManagementStudio, которую вы называете "на сервере", просто ставит _ клиентский таймаут_ в бесконечность.
В отличии от вашей клиентской программы.

Но на сервере запрос выполняется мгновенно, без задержек.
29 мар 16, 11:27    [18990108]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
RodikK
Member

Откуда:
Сообщений: 94
iap,

Спасибо, исправил
if exists (select * from Оплата where КодОплаты in (select КодОплаты from deleted)
update Оплата set Остаток=СуммаОплаты-(select sum(СуммаОплаты) from ОплатаОтгрузки where КодОплаты=(select КодОплаты from deleted)
29 мар 16, 11:32    [18990158]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
Glory
Member

Откуда:
Сообщений: 104751
RodikK
Glory
Клиентская утилита ManagementStudio, которую вы называете "на сервере", просто ставит _ клиентский таймаут_ в бесконечность.
В отличии от вашей клиентской программы.

Но на сервере запрос выполняется мгновенно, без задержек.

Еще раз - нельзя выполнить запрос "на сервере"
В архитекуре "клиент-сервер" всегда есть "клиентское приложение"
29 мар 16, 11:34    [18990176]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Glory
RodikK
пропущено...

Но на сервере запрос выполняется мгновенно, без задержек.

Еще раз - нельзя выполнить запрос "на сервере"
В архитекуре "клиент-сервер" всегда есть "клиентское приложение"


автор
if exists (select * from Оплата where КодОплаты in (select КодОплаты from deleted)

можно вообще убрать
29 мар 16, 11:36    [18990183]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
RodikK
Member

Откуда:
Сообщений: 94
TaPaK
можно вообще убрать


У меня собственно сначала без условия было. Но когда пробовал выяснить в чем ошибка, подумал, что если запись из табл.Оплата удаляется, то update не может сработать, и поэтому добавил условие, но не помогло(
29 мар 16, 11:41    [18990220]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
RodikK
Member

Откуда:
Сообщений: 94
Если записи из табл.ОплатаОтгрузки удалять по одной, то проблем тоже не возникает. Только в случае, когда именно запись из табл.Оплата удаляется.
29 мар 16, 11:46    [18990258]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
Glory
Member

Откуда:
Сообщений: 104751
RodikK
то проблем тоже не возникает.

У вас проблема в вашем клиентском коде - вы задали слишком малый таймаут ожидания выполнения запроса
29 мар 16, 11:51    [18990285]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
RodikK
Если записи из табл.ОплатаОтгрузки удалять по одной, то проблем тоже не возникает. Только в случае, когда именно запись из табл.Оплата удаляется.

запрос переписать надо вам. Возможно причина во взамных блокировках, update вообщем-то стрёмненько написан

хотя бы как то так

WITH cx (КодОплаты, Сумма)
AS
(
	select 
		КодОплаты,
		sum(СуммаОплаты) 
	from ОплатаОтгрузки 
	where 
		КодОплаты IN 
			(select КодОплаты from deleted)
)
update Оплата 
set Остаток=СуммаОплаты-Сумма
FROM cx
WHERE 
	cx.КодОплаты = Оплата.КодОплаты
29 мар 16, 11:51    [18990289]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
RodikK
Member

Откуда:
Сообщений: 94
TaPaK,

Спасибо, большое! Так работает.
29 мар 16, 12:09    [18990421]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить связанные записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
RodikK,

хуже другое, что запрос вообще творил :) и да интрига с одной скобкой
29 мар 16, 12:13    [18990454]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить