![]() |
Модераторы: Akina |
![]() ![]() ![]() |
|
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 5 Всего: 207 |
Стыдно спрашивать, но не могу сообразить простую казалось бы вещь: Нужен триггер который бы проверял любые Insert или Update запросы к таблице на наличие определённого условия (например создания должна быть меньше даты окончания) и если условие не выполнено то, вместо указываемой даты окончания должна подставляться дата создания. Логичнее всего было бы сделать что-то типа такого в триггере:
Но прямое редактирование таблицы Inserted запрещено. Возможно ли такое реализовать и если возможно то как? -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
Ты делаешь rollback текущей транзакции и либо возвращаешь raiseerror, либо вместо нее вызываешь выполнение запроса на Insert или Update с откорректированными данными.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
SergeBS |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 5 Всего: 22 |
Что-то не понял. Из 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 |
|||
|
||||
Vit |
|
||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 5 Всего: 207 |
Не годится, запроса реально я на уровне MS SQL Server не знаю, а отменять транзакцию... тогда мне менять хренову кучу программ, смысл в том чтоб не менять много кода, а корректно обрабатывать ситуацию на уровне сервера.
Угу, если меняется/вставляется одна строка, а если много? -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||
|
|||||
SergeBS |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 5 Всего: 22 |
Vit,
а в inserted тогда сколько будет? (не прикалываюсь, просто не пробовал - не знаю) Но подозреваю что именно то что надо и будет, т.е. пока транзакция не завершена, inserted пополняется. Затем срабатывает триггер, а уже затем commit/rollback. И после этого уже inserted очищается. Она именно для commit и нужна. |
|||
|
||||
Dian |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 2.1.2006 Репутация: нет Всего: 1 |
Вполне типичная ситуация. Нужно делать триггер типа IsteadOf (нерекурсивный) - только и всего ;)
|
|||
|
||||
SergeBS |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 5 Всего: 22 |
Dian,
Ну-ка поподробней: где такое в MS SQL? И причем здесь вообще рекурсия? |
|||
|
||||
Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 5 Всего: 207 |
Если несколько строк вовлечено то Inserted будет содержать несколько строк тоже, и commit/rallback будет относится ко всем строкам сразу.
Думал уже об IsteadOf , но что-то не совсем понятно как его применить, я ж заранее запрос не знаю какой прийдёт, хотя можно попробовать... А рекурсия... Рекурсия тут точно что не нужна, хотя не совсем понятно как её избежать для instead of триггеров, если честно то с ними не работал. Добавлено @ 04:52 Есть такой класс триггеров, впервые появились только в 2000 сервере, в отличие от обычных триггеров вызываются не после транзакции а вместо транзакции -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
Dian |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 2.1.2006 Репутация: нет Всего: 1 |
Наборы inserted / deleted никуда не деются - можно спокойно объявлять курсор по ним. У нас такие штуки почти на каждой таблице, в том числе и для проверки прав. Сами себя они в любом случае не вызовут, а вот насчет других триггеров - не знаю. Вообще это настраивается в общих свойствах базы |
|||
|
||||
SergeBS |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 5 Всего: 22 |
Vit,
Так это же вроде то, что нужно. И эта лабуда отработает как надо:
|
||||
|
|||||
mo3art |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 29.9.2005 Где: пло не та 3 емля Репутация: нет Всего: нет |
||||
|
||||
Dian |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 2.1.2006 Репутация: нет Всего: 1 |
||||
|
||||
malor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 632 Регистрация: 17.11.2006 Репутация: нет Всего: нет |
В триггерах можно создавать временные таблицы?
Вычитал что нет - на http://www.piter.com/lib/978527200003/sql7.phtml?fil=Ch12 В триггерах запрещены следующие команды SQL: Любые команды CREATE; ............ |
|||
|
||||
![]() ![]() ![]() |
Правила форума "MS SQL" | |
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MS SQL Server | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |