|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||||||
Тригер, проверяющ. есть ли такой ID и если есть обновляющий его, если нет - добавляющий02.06.2013, 02:34. Показов 1751. Ответов 9
Метки нет (Все метки)
Сабж.
В MSSQL нуб. Есть ситуация. Добавляю товар из каталога поставщика в каталог магазина. Может быть такое, что мы заказываем один и тот же товар второй раз. Нужно написать триггер учитывающий этот момент. Задачи триггера: 1. Добавление/изменение записи. 2. Обновления количества в таблице каталога поставщика. Я понимаю, что триггер должен быть по событию INSERT. Как я понял понятия "перед" или "после" нету, есть только после -AFTER. В других БД есть ON DUPLICATE KEY, как я понял, здесь такого нету. будем пробовать биться без этой фишки. Вот что я наискал, надумал и т.п. Код не мой, я в нем разбирался, изменял. По нему будут вопросы.
Дальше по строкам: 5. @@ROWCOUNT=1. Сама глобальная переменная - считает количество записей в таблице. а) Хочу уточнить. Количество записей во всей таблице или именно с этим ID? б) Еще момент. =1 почему? потому что у нас триггер срабатывает после и у нас уже добавлена запись получается? 13. Не очень понимаю, что нужно писать в values. В других бд видел что-то вроде "new.xxxx", где xxx название поля - это и было значением добавленным. нужно вставить что-то из inserted? 18-27 правильно ли тут поступаю? сюда попали по неуд условию, значит здесь записи есть и мы их обновляем. так сделал? 29. правильно ли обновляю количество товара у поставщика. может вопросы и тупые, но проверить этого не могу из-за того, что не знаю что писать в values в 13 строке. есть желающие выручить?)
0
|
||||||
| 02.06.2013, 02:34 | |
|
Ответы с готовыми решениями:
9
триггеры на проверку если запись есть то пропустить если нет то добавить... Обработка символьных данных. Yes, если есть символ в строке и NO если его нет Если есть форма и есть событие, а процедуры, его обрабатывающей нет в исходниках, то как это событие обрабатывается? |
|
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
|
|
| 02.06.2013, 14:33 | |
|
1. inserted - временная таблица с вставляемыми записями
2. @@ROWCOUNT=1 - триггер для групповой вставки работать не будет, а только для вставки по одной записи 3. value - список вставляемых значений - констант и выражений. inserted пользоваться можно как обычной таблицей заменил бы на INSERT INTO OrdersGoodsSup(GoodID, Count) SELECT i.GoodID,i.Count FROM inserted i 4. Count - неудачное название поля из ключевых слов T-SQL 5. Значение @count не определено в при вставке, поэтому в последнем UPDATE будут проблемы
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|||||||||||||||||
| 02.06.2013, 21:02 [ТС] | |||||||||||||||||
|
в любом случае - не получается пока. давайте с другово бока. пока что уберем update количества в SuppliersGoods у меня есть таблица SuppliersGoods, есть таблица OrdersGoodsSup. Из первой во вторую добавляются товары. Вторая это корзина. SuppliersGoods - ID, Name, Count, Price OrdersGoodsSup - ID, GoodID, Count, Price, OrderID (связь с номером заказа) Вторая связана с первой по GoodID. Мне необходимо, чтобы при первом добавлении записи в OrdersGoodsSup она просто добавлялась, а при повторном просто увеличивалось количество. Например: SuppliersGoods +----+------+------+------+ | ID |Name | Count| Price | +----+------+------+------+ | 5 |Good1| 50 | 500 | +----+------+------+------+ | 6 |Good2| 80 | 500 | +----+------+------+------+ OrdersGoodsSup +----+-------+------+------+ | ID |GoodID | Count| Price | +----+-------+------+------+ | | | | | +----+-------+------+------+ это состояние в первый момент. первое добавление:
OrdersGoodsSup +----+-------+------+------+ | ID |GoodID | Count| Price | +----+-------+------+------+ | 1 | 5 | 10 | 500 | +----+-------+------+------+
OrdersGoodsSup +----+-------+------+------+ | ID |GoodID | Count| Price | +----+-------+------+------+ | 1 | 5 | 30 | 500 | +----+-------+------+------+ ТАК ДОЛЖНО БЫТЬ. У меня работает триггер неправильно. У меня после двух таких запросов содержимое таблицы OrdersGoodsSup будет таким. +----+-------+------+------+ | ID |GoodID | Count| Price | +----+-------+------+------+ | 1 | 5 | 10 | 500 | +----+-------+------+------+ | 2 | 5 | 30 | 500 | +----+-------+------+------+ Это неправильно. Должно обновиться. Мало того, если в таблице OrdersGoodsSup были такие же товары, заканные несколькими заказами ранее - они обновятся. То есть для них триггер срабатывает. Я думаю это изза того, что мы не учитываем OrderID.
0
|
|||||||||||||||||
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
||
| 03.06.2013, 00:08 | ||
|
Начнем с того, что триггер for (after) insert срабатывает после соответствующей инструкции. Т.е., при попытке добавить в корзину позицию, которая там уже есть, вы получите в лучшем случае, если у вас хотя-бы нужные ограничения есть на таблице, соответствующую ошибку, в худшем, - бардак в таблице. Триггер должен быть instead of insert и в нем использовать инструкцию merge, если версия сервера позволяет.
0
|
||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||||||
| 03.06.2013, 00:40 [ТС] | ||||||
|
invm, о, о, о)) намного ближе к теме. очень похоже на ON DUPLICATE KEY
второе. я правильно подобрал table_target - OrdersGoodsSup и table_source - inserted? по идее я сравниваю то, что мы пытаемся вставить с тем, что уже вставлено. и если есть соответствие по этим полям, то MATCHED, если нет, то NOT. почему не работает? SQL Server 2012.
0
|
||||||
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
|
| 03.06.2013, 09:27 | |
|
VladSharikov, покажите полностью оригинальный текст триггера.
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||||||
| 03.06.2013, 18:17 [ТС] | ||||||
|
invm, вы сказали использовать merge, я начал делать заново. это не чей-то скрипт. это я сам уже делаю и походу спрашиваю у вас.
0
|
||||||
|
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
|
|
| 03.06.2013, 18:24 | |
|
Ну так зачем вы merge комментариями покорежили? Напишите ее полностью, согласно синтаксису.
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||||||
| 03.06.2013, 18:52 [ТС] | ||||||
|
invm, ой красота вообще))) спасибо вам огромное)))
не думал, что из-за этого будут проблемы! не встречал такого никогда. все заработало! Вот правильный триггер:
0
|
||||||
|
0 / 0 / 0
Регистрация: 06.10.2014
Сообщений: 24
|
||||||
| 12.11.2015, 08:44 | ||||||
|
VladSharikov,
Доброго Вам дня.. Вижу Вы сами разбирались с "лексикой" SQL. Я тоже только начинаю изучать. Подскажите - как правильно задать событие, чтобы триггер сработал? При чём на одной базе он работал, а на созданной вновь не хочет. Понимаю, что какая-то ошибка, только не могу найти где.. Select-ы для баз работают.. А триггер должен удалять записи об авторах, книг которых не осталось в библиотеке. Вот он сам:
0
|
||||||
| 12.11.2015, 08:44 | |
|
Помогаю со студенческими работами здесь
10
Машина Тьюринга: Удалить из слова Р его второй символ, если такой есть Машина Тьюринга. Удалить из слова P его третий символ, если такой есть Дан массив X(N). Найти наибольший элемент и поменять его местами с первым положительным элементом, если такой есть
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|