| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MS SQL Server > Триггер... |
| Автор: Vit 28.2.2006, 23:42 | ||
Стыдно спрашивать, но не могу сообразить простую казалось бы вещь: Нужен триггер который бы проверял любые Insert или Update запросы к таблице на наличие определённого условия (например создания должна быть меньше даты окончания) и если условие не выполнено то, вместо указываемой даты окончания должна подставляться дата создания. Логичнее всего было бы сделать что-то типа такого в триггере:
Но прямое редактирование таблицы Inserted запрещено. Возможно ли такое реализовать и если возможно то как? |
| Автор: Akina 1.3.2006, 10:46 |
| Ты делаешь rollback текущей транзакции и либо возвращаешь raiseerror, либо вместо нее вызываешь выполнение запроса на Insert или Update с откорректированными данными. |
| Автор: SergeBS 1.3.2006, 12:30 |
| Что-то не понял. Из BOL MS SQL 7: First, rows are inserted into the table and the inserted table, and then the trigger fires. Т.е. вроде можно просто в таблицу записать нужную величину и все. Попробуй влепить в триггер просто что-то типа: if a=1 and b=2 set c = 3 where id = inserted.id |
| Автор: SergeBS 1.3.2006, 17:42 | ||
Vit,
а в inserted тогда сколько будет? (не прикалываюсь, просто не пробовал - не знаю) Но подозреваю что именно то что надо и будет, т.е. пока транзакция не завершена, inserted пополняется. Затем срабатывает триггер, а уже затем commit/rollback. И после этого уже inserted очищается. Она именно для commit и нужна. |
| Автор: Dian 1.3.2006, 18:19 |
| Вполне типичная ситуация. Нужно делать триггер типа IsteadOf (нерекурсивный) - только и всего ;) |
| Автор: SergeBS 1.3.2006, 19:57 | ||
Dian,
Ну-ка поподробней: где такое в MS SQL? И причем здесь вообще рекурсия? |
| Автор: Vit 2.3.2006, 04:51 | ||||
Если несколько строк вовлечено то Inserted будет содержать несколько строк тоже, и commit/rallback будет относится ко всем строкам сразу.
Думал уже об IsteadOf , но что-то не совсем понятно как его применить, я ж заранее запрос не знаю какой прийдёт, хотя можно попробовать... А рекурсия... Рекурсия тут точно что не нужна, хотя не совсем понятно как её избежать для instead of триггеров, если честно то с ними не работал. Добавлено @ 04:52 Есть такой класс триггеров, впервые появились только в 2000 сервере, в отличие от обычных триггеров вызываются не после транзакции а вместо транзакции |
| Автор: Dian 2.3.2006, 05:20 |
| Наборы inserted / deleted никуда не деются - можно спокойно объявлять курсор по ним. У нас такие штуки почти на каждой таблице, в том числе и для проверки прав. Сами себя они в любом случае не вызовут, а вот насчет других триггеров - не знаю. Вообще это настраивается в общих свойствах базы |
| Автор: SergeBS 2.3.2006, 08:40 | ||||
Vit,
Так это же вроде то, что нужно. И эта лабуда отработает как надо:
|
| Автор: mo3art 14.3.2006, 15:47 | ||
-курсор в триггере это круто! |
| Автор: Dian 16.3.2006, 10:49 |
| Угадай с трех раз! Вообще - то, для чего он и предназначен |
| Автор: malor 8.9.2008, 17:38 |
| В триггерах можно создавать временные таблицы? Вычитал что нет - на http://www.piter.com/lib/978527200003/sql7.phtml?fil=Ch12 В триггерах запрещены следующие команды SQL: Любые команды CREATE; ............ |