Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
1

MS-Sql ошибка при отработке тригера

05.03.2012, 20:04. Просмотров 551. Ответов 5
Метки нет (Все метки)

есть 2 таблицы:
1. склад, где храниться кол-во предметов
2. количество предметов которые были получены в определенный день

при удалении строк со второй таблицы отрабатывает триггер который отнимает соответствующее кол-во предметов со склада.

все бы хорошо, НО. в один день один и тот же предмет получили 2 раза 10 штук и 20 штук.
удаляю приход в этот день в результате - обе строчки в таблице2 +10 и +20 отсутствуют, но отняло только 20 штук.
такое впечатление, что тут причина в "Грязном чтении". удаляет 10, считывает старые данные и удаляет 20 сохранив последний результат.
поставил в триггере SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED - это не помогло.

уважаемые гуру, подскажите в чем может быть причина и как избежать такой ошибки.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2012, 20:04
Ответы с готовыми решениями:

Реализация тригера в базе данных SQL
Есть проект c# с базой данных посещений занятий, не получается реализовать тригер, который...

Ошибка при подключении к SQL базе данных при переносе программы
Я добавил базу данных SQL "*.mdf" к проекту. Если использовать параметры строки подключения типа:...

Ошибка при подключении к SQL
Не запускается прога с привязкой к БД. Вот текст. Подробная информация об использовании...

Ошибка при подключении к MS SQL
Доброго времени суток, помогите пожалуйста в решении проблемы, пишу на C# для КПК. Пробую...

Ошибка при работе с БД SQL
Всем здравствуйте. Есть: 1)SQL server 2005(с базой) 2)MVS 2010 Создал простейшее...

5
_katon_
384 / 240 / 19
Регистрация: 03.10.2011
Сообщений: 985
05.03.2012, 21:12 2
1. Тема точно имеет отношение больше к ветке с какой-нибудь СУБД (Подозреваю, что MS);
2. Хотелось бы глянуть на сам триггер?
3. Несмотря на объяснения не очень понятна структура данных. На складе для наименования хранится общее количество, а для учета расход/приход используется отдельная таблица?
1
Learx
1046 / 853 / 194
Регистрация: 31.03.2010
Сообщений: 2,490
05.03.2012, 21:34  [ТС] 3
Таблица1- Stock: Id, Count
Таблица2 - StockIn: Id, CountIn, DayIn
Id - ключ предмета
было:

T-SQL
1
2
3
4
Update Stock Set Count=Count-deleted.CountIn 
    from deleted 
        inner join Stock
                on Stock.Id = deleted.Id
сделал и работает:

T-SQL
1
2
3
4
5
    Update Stock Set Count=Count+S.C
    from (Select Id, sum(deleted.CountIn) as C
            from deleted 
            group by Id) as S
     where Stock.Id=S.Id

всем спасибо кто отозвался
0
nio
5965 / 3371 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
06.03.2012, 10:45 4
Цитата Сообщение от Learx Посмотреть сообщение
уважаемые гуру, подскажите в чем может быть причина и как избежать такой ошибки.
Хранить вычисляемые данные в таблицах - это уже изначально неправильный подход, и допускается только в крайне обоснованных случаях.
К примеру, если есть связанные таблицы "Поставка" и "Реализация", то во 2-ю таблицу пишется количество реализованных товаров, а в 1-ю только количество поставленного товара, остатки при этом писать не нужно, потому что их всегда можно получить запросом "поставлено - реализовано"
1
NowMatrix
96 / 79 / 16
Регистрация: 14.01.2011
Сообщений: 438
07.03.2012, 01:11 5
nio, А можно пример запроса ,как можно остаток получить запросом "поставлено - реализовано"
0
nio
5965 / 3371 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
07.03.2012, 07:48 6
Ну то что таблицы поставок(Supply) и продаж(Sale) должны быть связаны наверное объяснять не нужно
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT s1.supply_Count, (s1.supply_Count - ISNULL(s2.sum_Count,0)) AS rest
FROM Supply AS s1 INNER JOIN 
   (SELECT s3.ID_Supply,SUM(s3.sale_Count) AS sum_Count 
    FROM Sale AS s3 
    GROUP BY s3.ID_Supply 
    HAVING  s3.ID_Supply=s1.ID_Supply) AS s2 
ON s2.ID_Supply=s1.ID_Supply
 
--s1.supply_Count - количество поставленного товара
--s3.sale_Count - количество проданных едениц товара за одну операцию (в одной записи)
--в результате будут количество полученных товаров и остаток
запрос написан от руки, поэтому могут быть ошибки, но общий смысл такой
1
07.03.2012, 07:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2012, 07:48

Ошибка при создании БД Sql Server
Здравствуйте. Пытаюсь создать новую БД, получаю вот такую ошибку. В чем может быть дело?

Ошибка при подключении к SQL Server
День добрый при компиляции в VS кода вылетает первоначально данная ошибка так же она вылетает при...

Ошибка при соединении с SQL Server
Делаю первые шаги в создании базы данных на Visual Studio когда после попытки только создать бд...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru