Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Триггер... 
:(
    Опции темы
Vit
Дата 28.2.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 5
Всего: 207



Стыдно спрашивать, но не могу сообразить простую казалось бы вещь: Нужен триггер который бы проверял любые Insert или Update запросы к таблице на наличие определённого условия (например создания должна быть меньше даты окончания) и если условие не выполнено то, вместо указываемой даты окончания должна подставляться дата создания. Логичнее всего было бы сделать что-то типа такого в триггере:

Код

Update Inserted
Set Ended=Created
Where Ended<Created 


Но прямое редактирование таблицы 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
PM MAIL WWW ICQ   Вверх
Akina
Дата 1.3.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Ты делаешь rollback текущей транзакции и либо возвращаешь raiseerror, либо вместо нее вызываешь выполнение запроса на Insert или Update с откорректированными данными.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SergeBS
Дата 1.3.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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
PM MAIL   Вверх
Vit
Дата 1.3.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 5
Всего: 207



Цитата(Akina @ 1.3.2006, 01:46 Найти цитируемый пост)
Ты делаешь rollback текущей транзакции и либо возвращаешь raiseerror, либо вместо нее вызываешь выполнение запроса на Insert или Update с откорректированными данными.


Не годится, запроса реально я на уровне MS SQL Server не знаю, а отменять транзакцию... тогда мне менять хренову кучу программ, смысл в том чтоб не менять много кода, а корректно обрабатывать ситуацию на уровне сервера.


Цитата(SergeBS @ 1.3.2006, 03:30 Найти цитируемый пост)
.е. вроде можно просто в таблицу записать нужную величину и все.
Попробуй влепить в триггер просто что-то типа:
if a=1 and b=2
set c = 3 where id = inserted.id


Угу, если меняется/вставляется одна строка, а если много?



--------------------
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
PM MAIL WWW ICQ   Вверх
SergeBS
Дата 1.3.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 5
Всего: 22



Vit,
Цитата

Угу, если меняется/вставляется одна строка, а если много?

а в inserted тогда сколько будет? (не прикалываюсь, просто не пробовал - не знаю) Но подозреваю что именно то что надо и будет, т.е. пока транзакция не завершена, inserted пополняется. Затем срабатывает триггер, а уже затем commit/rollback. И после этого уже inserted очищается. Она именно для commit и нужна.
PM MAIL   Вверх
Dian
Дата 1.3.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 2.1.2006

Репутация: нет
Всего: 1



Вполне типичная ситуация. Нужно делать триггер типа IsteadOf (нерекурсивный) - только и всего ;)
PM MAIL WWW   Вверх
SergeBS
Дата 1.3.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 5
Всего: 22



Dian,
Цитата

Вполне типичная ситуация. Нужно делать триггер типа IsteadOf (нерекурсивный) - только и всего ;)

Ну-ка поподробней: где такое в MS SQL? И причем здесь вообще рекурсия?
PM MAIL   Вверх
Vit
Дата 2.3.2006, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 5
Всего: 207



Цитата(SergeBS @ 1.3.2006, 08:42 Найти цитируемый пост)
в inserted тогда сколько будет? (не прикалываюсь, просто не пробовал - не знаю) Но подозреваю что именно то что надо и будет, т.е. пока транзакция не завершена, inserted пополняется. Затем срабатывает триггер, а уже затем commit/rollback. И после этого уже inserted очищается. Она именно для commit и нужна.


Если несколько строк вовлечено то Inserted будет содержать несколько строк тоже, и commit/rallback будет относится ко всем строкам сразу.

Цитата(Dian @ 1.3.2006, 09:19 Найти цитируемый пост)
Вполне типичная ситуация. Нужно делать триггер типа IsteadOf (нерекурсивный) - только и всего ;)


Думал уже об IsteadOf , но что-то не совсем понятно как его применить, я ж заранее запрос не знаю какой прийдёт, хотя можно попробовать... А рекурсия... Рекурсия тут точно что не нужна, хотя не совсем понятно как её избежать для instead of триггеров, если честно то с ними не работал.
Добавлено @ 04:52
Цитата(SergeBS @ 1.3.2006, 10:57 Найти цитируемый пост)
Ну-ка поподробней: где такое в MS SQL?



Есть такой класс триггеров, впервые появились только в 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
PM MAIL WWW ICQ   Вверх
Dian
Дата 2.3.2006, 05:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 2.1.2006

Репутация: нет
Всего: 1



Цитата(Vit @ 2.3.2006, 12:51 Найти цитируемый пост)
я ж заранее запрос не знаю какой прийдёт, хотя можно попробовать...

Наборы inserted / deleted никуда не деются - можно спокойно объявлять курсор по ним.
У нас такие штуки почти на каждой таблице, в том числе и для проверки прав.

Цитата(Vit @ 2.3.2006, 12:51 Найти цитируемый пост)
хотя не совсем понятно как её избежать для instead of триггеров

Сами себя они в любом случае не вызовут, а вот насчет других триггеров - не знаю. Вообще это настраивается в общих свойствах базы
PM MAIL WWW   Вверх
SergeBS
Дата 2.3.2006, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 5
Всего: 22



Vit,
Цитата

Если несколько строк вовлечено то Inserted будет содержать несколько строк тоже, и commit/rallback будет относится ко всем строкам сразу.

Так это же вроде то, что нужно. И эта лабуда отработает как надо:
Цитата

if a=1 and b=2
set c = 3 where id = inserted.id

PM MAIL   Вверх
mo3art
Дата 14.3.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.9.2005
Где: пло не та 3 емля

Репутация: нет
Всего: нет



Цитата(Dian @ 2.3.2006, 05:20 Найти цитируемый пост)
Наборы inserted / deleted никуда не деются - можно спокойно объявлять курсор по ним.

-курсор в триггере это круто! smile а чего вы ими там делаете? если не секрет?

PM MAIL   Вверх
Dian
Дата 16.3.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 2.1.2006

Репутация: нет
Всего: 1



Цитата(mo3art @ 14.3.2006, 23:47 Найти цитируемый пост)
а чего вы ими там делаете? если не секрет?

Угадай с трех раз!
Вообще - то, для чего он и предназначен smile
PM MAIL WWW   Вверх
malor
Дата 8.9.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



В триггерах можно создавать временные таблицы?

Вычитал что нет - на http://www.piter.com/lib/978527200003/sql7.phtml?fil=Ch12
В триггерах запрещены следующие команды SQL: 
Любые команды CREATE;
............

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1215 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.