|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
Версия сервера 11.0.1.3069. Добрый день, пытаюсь написать триггер. Триггер срабатывает при обновлении поля MaintBudgetID или CompID в таблице Functions. После чего триггер должен обновить поле BudgetCodeDefID в таблице WorkOrder. Значение берется из поля MaintBudgetID (таблица Functions). Обновить нужно все строки, где поле CompID равны в обеих таблицах. Создание таблицы Functions Код: sql 1. 2. 3. 4. 5.
Заполнение таблицы Functions Код: sql 1.
Создание таблицы WorkOrder Код: sql 1. 2. 3. 4. 5.
Заполнение таблицы WorkOrder Код: sql 1. 2. 3.
Выполняем запрос для запуска триггера Код: sql 1.
В результате чего в таблице WorkOrder должно обновиться 3 записи WorkOrderID CompID BudgetCodeDefID100005322100005329100005321100005323100005329100005321100005324100005329100005321 Пишу триггер. Пытаюсь использовать курсоры, чтоб последовательно обновить каждую запись в таблице WorkOrder: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Но Sybase выдает мне ошибку Код: sql 1. 2. 3. 4.
Пожалуйста, подскажите что я делаю не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2019, 19:02 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
А зачем вам курсор, все 3-и значения известны, сделайте прямой update, если хочется побегать по курсору, то добавьте в него ключ, и обновляйте по ключу... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2019, 22:55 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
nastyaiwanowa21, подозреваю, схема данных у Вас ещё та. Не вариант сделать человеческий форейн-ключ с апдейтом? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 11:21 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
1) Sergey OrlovА зачем вам курсор, все 3-и значения известны, сделайте прямой update Вы имеете в виду, что то такое? : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Это первое, что я попробовала, но появилась ошибка: Код: sql 1. 2. 3. 4.
Поэтому попыталась использовать курсор, как написала выше, но это не помогло. 2) Sergey Orlovдобавьте в него ключ, и обновляйте по ключу Что Вы имеете в виду? Курсор и так пробегает по ключам WorkorderID. Код: sql 1. 2. 3. 4.
3)KreatorXXIподозреваю, схема данных у Вас ещё та Возможно, я только начинаю ее познавать. 4)KreatorXXIНе вариант сделать человеческий форейн-ключ с апдейтом? Это самый крайний вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 13:04 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
nastyaiwanowa21Это самый крайний вариант. Почему самый крайний? Это самый правильный. Если не хотите самый правильный, то сделайте простой update, типа: Код: sql 1. 2. 3.
Использование курсоров здесь как-то ни к месту. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 15:00 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
KreatorXXI, Делала уже так. Выдает ошибку. Я подумала, что она появляется из-за того, что я пытаюсь обновить одновременно несколько записей, поэтому и добавила курсор. Но курсор не помог. Не понимаю, что ему нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 15:51 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
nastyaiwanowa21, а СУБД-то какая? ASA? ASE? IQ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 16:44 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
nastyaiwanowa21, Пока общее замечание не относящиеся к вопросу: ВОт гляди: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Ни одной обработки ошибок! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 16:47 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
KreatorXXI, Из документации Sybase You tried to use a SELECT statement without a cursor, but the statement cursor returns more than one row. Only a single row SELECT statement can be used in this context. Я так поняла, что он ругается, что я не использую курсор. Разве нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 16:47 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
MasterZiv, MasterZivа СУБД-то какая? ASA? ASE? IQ? ASA 11. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 16:50 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
02.09.2019 19:02, nastyaiwanowa21 пишет: > declare @WorkorderIDnumeric(12); > declare CUR_CUSTOMERdynamic scroll cursor FOR > select WorkorderID > from amos.WorkOrder > where CompID = newdata.CompID; > OPEN CUR_CUSTOMER; > FETCH NEXT CUR_CUSTOMERINTO @WorkorderID; > while (sqlcode = 0) > loop > update amos.WorkOrder > set BudgetCodeDefID = newdata.MaintBudgetID > WHERE WorkorderID = @WorkorderID; > FETCH NEXT CUR_CUSTOMERINTO @WorkorderID; > end loop; > CLOSE CUR_CUSTOMER; Зачем это кошмарное микрософтообразное уродство? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 17:56 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
Dim2000, авторЗачем это кошмарное микрософтообразное уродство? Критикуешь - предлагай. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 18:07 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
Для начала, 1. у вас что на таблице куча триггеров на одно событие update, это к тому что указан order 10, если один так уберите это служебное слово 2. после begin сразу присвойте значения из new, примерно так set tempCompID = newdata.CompID, ну а дальше обрабатывайте записи в WorkOrder ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2019, 21:02 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
Sergey Orlov, Sergey Orlov1. у вас что на таблице куча триггеров на одно событие update, это к тому что указан order 10, если один так уберите это служебное слово Да, еще два, сформированы системой, которая использует эту базу. Sergey Orlov2. после begin сразу присвойте значения из new, примерно так set tempCompID = newdata.CompID, ну а дальше обрабатывайте записи в WorkOrder Сделала так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Не помогло. Ошибка осталась. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2019, 10:34 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
nastyaiwanowa21, Ошибка про select с возвратом нескольких rows к "нашим" update'ам отношения не имеет. Наверняка ещё какой-то триггер с ошибкой. Естественно в таблице WorkOrder (которую апдейтят). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2019, 10:50 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
Вообще, триггера -- это трындец. Надо их запретить вообще. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2019, 18:42 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
nastyaiwanowa21, Только что обратил внимание на то, что вы делаете CREATE TRIGGER , все это работает, только, если триггера нет в базе, как только вы скрипт первый раз запустили, то триггер создался и если вы его хотите изменить, то Alter trigger... либо связка drop trigger ... create trigger... в противном случае ошибка... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2019, 12:21 |
|
Создание триггера обновляющего несколько строк в таблице
|
|||
---|---|---|---|
#18+
KreatorXXI, KreatorXXIОшибка про select с возвратом нескольких rows к "нашим" update'ам отношения не имеет. Наверняка ещё какой-то триггер с ошибкой. Естественно в таблице WorkOrder (которую апдейтят). Вы правы. Дело было действительно в этом. До того как выполнялся мой триггер, на таблице workorder висел другой триггер, который выполнялся раньше его. И имел в себе функцию которая во вложенном под запросе возвращала более одной записи. Удалили лишнии записи все работает как и задумано. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2019, 10:52 |
|
|
Start [/forum/topic.php?fid=55&tid=2009581]: |
0ms |
get settings: |
25ms |
get forum list: |
10ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
76ms |
get topic data: |
18ms |
get forum data: |
5ms |
get page messages: |
1226ms |
get tp. blocked users: |
3ms |
others: | 167ms |
total: | 1542ms |
0 / 0 |