Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
Привет всем. Никто не знает можно ли как-нибудь обойти ошибки в триггере? Поясню. Например есть триггер: create trigger update_test on test for insert as insert test_upd (a,b) select a,b from inserted Соответственно, если например, в таблице test или test_upd удалить столбец b, то insert на который сработал триггер не выполнится. Можно ли как нибудь обойти эту ошибку, чтобы ошибка в триггере не вызывала ошибку запроса на который триггер сработал? Можно конечно проверять структуры таблиц test & test_upd но это не очень быстрый вариант или это можно сделать быстро? С уважением, Alexander ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 11:33 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
Очень странное желание вообще-то. Для меня такая постановка вопроса практически равнозначна ошибке проектирования базы. По вашим словам получается, что триггер будет пропускать все запросы - правильные и неправильные. Встречный вопрос - а нафига тогда триггер ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 12:35 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
Предположим триггер устанавливается на чужую базу и я даже не знаю как она была спроектирована, мне это и не нужно. Нужно чтобы установка триггера не нарушила нормальной работы, _даже_ если структура базы изменится. Поэтому есть вариант проверок на наличие таблиц их структуру, но я боюсь что это будет долго и при большом количестве транзакций будет заметное снижение производительности. Вариант номер 2 - игнорировать ошибки, но видимо так не получится сделать. Regards, Alexander. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 12:54 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
Для меня тоже совсем ничего не понятно. С помощью триггеров обычно реализуются бизнес правила и/или ссылочная целостность. Как можно это сделать не зная структуры базы для меня загадка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 13:02 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
2Genady: Ну задача у меня такая Ведь кроме реализации бизнес правил и/или ссылочной целостности на триггерах можно делать еще много чего другого. Аудит например. Конечно на момент написания триггера я знаю структуру базы, но она может измениться со временем, а меня рядом не будет и нужно чтобы все не упало. -- Народ!! Извините, но же не спрашиваю "а нужно ли мне триггер вешать?" Просто интересно может, кто знает - как можено игнорировать или обработать ошибку в триггере? На сколько я понял это не возможно, просто может все-таки есть какие-нибудь хитроумные методы С уважением, Александр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 13:11 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
2judge: неубедительно. Лажа в самой постановке вопроса. "на момент написания триггера я знаю структуру базы, но она может измениться со временем" - понятие "структура базы" включает в себя не только таблицы с их полями, но и все остальное - и триггера в том числе. Изменение структуры таблицы _подразумевает_ изменение и ее триггеров, если это необходимо. Если найдется девелопер, который поменяет таблицу, не посмотрев, что за триггера на нее повешены, то он придурок и остальное его проблемы, не ваши. Более-менее разумным представляется автоматическое формирование тела триггера (пусть это будет sp). Меняете таблицу - вызывайте эту sp, она сама сгенерит и подключит _правильный_ триггер. И то правомерность такого подхода у меня вызывает определенные сомнения. Что касается примера с аудитом (в самом первом сообщении) - если меняется структура таблицы, то триггер становится некорректным, поскольку он опирается на первоначальную структуру. Помимо него некорректной становится таблица test_upd, потому что не факт, что об обновлении ее структуры кто-нибудь позаботился. Ну и что - так и тянуть модификации всех связанных объектов ? У меня сильные подозрения, что все убеждения пройдут мимо. ОК, игнорировать ошибку нельзя. Обработать ее так, что отката не произойдет, тоже нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 13:37 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
2 judge Я в общем против такого подхода, но может Вам он и поможет. Посмотрите ветку "Дилема-разные базы данных", там Garya описывает свой подход с макрообъектами. P.S. В названии ветки мог ошибиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 13:55 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
Вот эта ветка: http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=1299 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 14:03 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
Ну вот, совсем запинали 2GreenSunrise: Наверное, я правда написал "Лажу" в самой постановке вопроса. Согласен, что понятие "структура базы" включает в себя и триггера. Давайте я все-таки еще одну попытку сделаю. Есть универсальная система аудита. Триггера формируются автоматически этой системой. Соответственно она предназначена для различных компаний, которые хотят добавить возможность аудита к используемому софту, если в нем эта возможность отсутствует. Расказ в трех действующих лицах . Соответственно имеем три лица. (буду называть всех сокращенно: ПП - производитель программы ПО - пользователь программы (и системы аудита) ПА - производитель системы аудита) Сам пример: ПП производит систему бух.учета. ПО пользуется этой системой, но в ней отсутствует аудита изменений в БД. Тогда ПО обращается к ПА и берет у него систему аудита. Система аудита создает триггера на необходимые таблицы и выдает отчеты на основании данных аудита. В один прекрасный день ПП - присылает update к базе данных. ПП вовсе и неподозревает о существовании ПА с его системой аудита. После запуска update - необходимо перезапустить систему аудита, чтобы она проверила, какие таблицы были изменены и пересоздала необходимые триггеры. Однако если ПО забудет это сделать, то скорее всего при выполнении триггеров будут происходить ошибки, что повлечет развал всей БД . По этому мне (как ПА) необходимо это предусмотреть, для чего можно: либо встроить проверку на изменение структуры БД в триггера, либо игнорировать ошибки с alert'ом в систему аудита. Извините за столь запутанные объяснения. Может быть это не очень наглядный пример. С уважением, Александр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 14:30 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
Объяснения очень даже ясные. Некоторые вопросы отпали после вашей "поэмы" Я по-прежнему не думаю, что формирование сложных триггеров с проверкой корректности структуры чуть ли не при каждом запросе - хорошая мысль. По-моему, неплохим решением была бы проверка ОДИН РАЗ при каждом запуске программы клиента. Делаем общую сверку структур по всей базе и если что не так - мессага "изменилась база, запустите реинстолл аудита". И все, забываем про проверки до следующего старта. Классным решением было бы повесить триггер на sysobjects и syscolumns, чтобы отслеживать изменения в структуре базы, но, к сожалению, триггера на системные таблицы вешать нельзя, увы Второе решение - в инстолле к своей программе аудита пишем крупными буквами "при изменении структуры базы обязательно перезапустите наш инсталлятор!". Честно говоря, оно мне кажется самым приемлемым. В любом случае аудит работать перестанет! Только в одном случае ошибку заметят сразу после update'а базы, а в другом - она будет незаметно подавляться, пока не настанет время отчета, а отчет - тю-тю. Не велся аудит последний год. Опа! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 15:07 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
У меня точно такие же мысли. Главное написать, что если реинсталл не запустите - то я не виноват ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 15:45 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
А может повесить задание, которое в заданные пользователем интервалы времени будет сверять структуру и, в случае расхождения, переинстолит аудит. Задание можно сформировать сразу при интстоляции, а сроки проверки можно ограничить списком возможных значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2001, 05:23 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
Уважаемый judge! А почему ПО при получении НВПР от ПП не может запустить инсталлятор (или модификатор) ПРА? И ПА спокоен! ПРА - система аудита НВПР - новая версия программы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2001, 06:54 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
Я не берусь судить автора вопроса, хотя с его подходом тоже не согласен. Ну наплевать ему, будет работать триггер или нет. Главное, чтобы он при своей нерабочести не вызывал невозможности выполнять операции U/D/I над таблицей. Как я понял, триггер "не обязательный для выполнения" ... Создаешь вспомогательныю таблицу, в которую из триггера помещаются команды - тот скрипт, который должен работать внутри триггера. Один раз в минуту срабатывает задание, которое просматривает эту таблицу и выполняет упавшие в таблицу команды, после чего их оттуда удаляет. Выполнятся команды успешно или нет - дело десятое (в принципе, можно помещать флаг успешности вывполнения команды в эту таблицу и НЕ удалять из нее неуспешно выполненные команды). Решение неуклюжее, посольку таблицами inserted и deleted пользоваться нельзя. А как ты хотел? Ведь их структура изменяется вместе со структурой базовой таблицы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2001, 07:38 |
|
||
|
Обработка ошибки внутри триггера.
|
|||
|---|---|---|---|
|
#18+
2alexeyvg: Может (должен) запустить - но если не запустит проверка нужна для подстраховки, чтобы база не разъехалась. (Я думаю что это просто будет опционально. Если Очень важно чтобы все работало - то вставляется доп. проверка на структуру таблиц. 2garya: Как раз из-за того, что inserted & deleted изменяются вместе со структурой таблицы, я и хочу делать проверки чтобы небыло ошибок. Ваш вариант очень интересный, но в моем случае к сожалению не подойдет (из за изменения структуры inserted&deleted). PS. Когда все будет готово я дам ссылку на тестовую версию - может быть кому-нибудь будет интересно поиграться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2001, 08:17 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3569&tid=1826484]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
24ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 327ms |

| 0 / 0 |
