powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Обработка ошибки внутри триггера.
15 сообщений из 15, страница 1 из 1
Обработка ошибки внутри триггера.
    #32007496
Фотография judge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

Никто не знает можно ли как-нибудь обойти ошибки в триггере? Поясню.
Например есть триггер:

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
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007502
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень странное желание вообще-то. Для меня такая постановка вопроса практически равнозначна ошибке проектирования базы. По вашим словам получается, что триггер будет пропускать все запросы - правильные и неправильные. Встречный вопрос - а нафига тогда триггер ?
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007506
Фотография judge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположим триггер устанавливается на чужую базу и я даже не знаю как она была спроектирована, мне это и не нужно. Нужно чтобы установка триггера не нарушила нормальной работы, _даже_ если структура базы изменится. Поэтому есть вариант проверок на наличие таблиц их структуру, но я боюсь что это будет долго и при большом количестве транзакций будет заметное снижение производительности. Вариант номер 2 - игнорировать ошибки, но видимо так не получится сделать.

Regards, Alexander.
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007508
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для меня тоже совсем ничего не понятно. С помощью триггеров обычно реализуются бизнес правила и/или ссылочная целостность. Как можно это сделать не зная структуры базы для меня загадка.
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007511
Фотография judge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Genady:
Ну задача у меня такая Ведь кроме реализации бизнес правил и/или ссылочной целостности на триггерах можно делать еще много чего другого. Аудит например. Конечно на момент написания триггера я знаю структуру базы, но она может измениться со временем, а меня рядом не будет и нужно чтобы все не упало.

--
Народ!! Извините, но же не спрашиваю "а нужно ли мне триггер вешать?" Просто интересно может, кто знает - как можено игнорировать или обработать ошибку в триггере? На сколько я понял это не возможно, просто может все-таки есть какие-нибудь хитроумные методы

С уважением, Александр.
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007516
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2judge: неубедительно. Лажа в самой постановке вопроса. "на момент написания триггера я знаю структуру базы, но она может измениться со временем" - понятие "структура базы" включает в себя не только таблицы с их полями, но и все остальное - и триггера в том числе. Изменение структуры таблицы _подразумевает_ изменение и ее триггеров, если это необходимо. Если найдется девелопер, который поменяет таблицу, не посмотрев, что за триггера на нее повешены, то он придурок и остальное его проблемы, не ваши.

Более-менее разумным представляется автоматическое формирование тела триггера (пусть это будет sp). Меняете таблицу - вызывайте эту sp, она сама сгенерит и подключит _правильный_ триггер. И то правомерность такого подхода у меня вызывает определенные сомнения.

Что касается примера с аудитом (в самом первом сообщении) - если меняется структура таблицы, то триггер становится некорректным, поскольку он опирается на первоначальную структуру. Помимо него некорректной становится таблица test_upd, потому что не факт, что об обновлении ее структуры кто-нибудь позаботился. Ну и что - так и тянуть модификации всех связанных объектов ?

У меня сильные подозрения, что все убеждения пройдут мимо. ОК, игнорировать ошибку нельзя. Обработать ее так, что отката не произойдет, тоже нельзя.
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007524
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 judge

Я в общем против такого подхода, но может Вам он и поможет. Посмотрите ветку "Дилема-разные базы данных", там Garya описывает свой подход с макрообъектами.

P.S. В названии ветки мог ошибиться.
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007525
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007529
Фотография judge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, совсем запинали

2GreenSunrise: Наверное, я правда написал "Лажу" в самой постановке вопроса. Согласен, что понятие "структура базы" включает в себя и триггера.

Давайте я все-таки еще одну попытку сделаю.

Есть универсальная система аудита.
Триггера формируются автоматически этой системой. Соответственно она предназначена для различных компаний, которые хотят добавить возможность аудита к используемому софту, если в нем эта возможность отсутствует.
Расказ в трех действующих лицах . Соответственно имеем три лица. (буду называть всех сокращенно:
ПП - производитель программы
ПО - пользователь программы (и системы аудита)
ПА - производитель системы аудита)

Сам пример:
ПП производит систему бух.учета. ПО пользуется этой системой, но в ней отсутствует аудита изменений в БД. Тогда ПО обращается к ПА и берет у него систему аудита. Система аудита создает триггера на необходимые таблицы и выдает отчеты на основании данных аудита. В один прекрасный день ПП - присылает update к базе данных. ПП вовсе и неподозревает о существовании ПА с его системой аудита. После запуска update - необходимо перезапустить систему аудита, чтобы она проверила, какие таблицы были изменены и пересоздала необходимые триггеры. Однако если ПО забудет это сделать, то скорее всего при выполнении триггеров будут происходить ошибки, что повлечет развал всей БД . По этому мне (как ПА) необходимо это предусмотреть, для чего можно: либо встроить проверку на изменение структуры БД в триггера, либо игнорировать ошибки с alert'ом в систему аудита.

Извините за столь запутанные объяснения. Может быть это не очень наглядный пример.

С уважением, Александр.
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007532
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объяснения очень даже ясные. Некоторые вопросы отпали после вашей "поэмы"

Я по-прежнему не думаю, что формирование сложных триггеров с проверкой корректности структуры чуть ли не при каждом запросе - хорошая мысль. По-моему, неплохим решением была бы проверка ОДИН РАЗ при каждом запуске программы клиента. Делаем общую сверку структур по всей базе и если что не так - мессага "изменилась база, запустите реинстолл аудита". И все, забываем про проверки до следующего старта.
Классным решением было бы повесить триггер на sysobjects и syscolumns, чтобы отслеживать изменения в структуре базы, но, к сожалению, триггера на системные таблицы вешать нельзя, увы

Второе решение - в инстолле к своей программе аудита пишем крупными буквами "при изменении структуры базы обязательно перезапустите наш инсталлятор!". Честно говоря, оно мне кажется самым приемлемым. В любом случае аудит работать перестанет! Только в одном случае ошибку заметят сразу после update'а базы, а в другом - она будет незаметно подавляться, пока не настанет время отчета, а отчет - тю-тю. Не велся аудит последний год. Опа!
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007533
Фотография judge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня точно такие же мысли. Главное написать, что если реинсталл не запустите - то я не виноват
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007553
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может повесить задание, которое в заданные пользователем интервалы времени будет сверять структуру и, в случае расхождения, переинстолит аудит. Задание можно сформировать сразу при интстоляции, а сроки проверки можно ограничить списком возможных значений.
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007563
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый judge!
А почему ПО при получении НВПР от ПП не может запустить инсталлятор (или модификатор) ПРА? И ПА спокоен!

ПРА - система аудита
НВПР - новая версия программы
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007577
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не берусь судить автора вопроса, хотя с его подходом тоже не согласен. Ну наплевать ему, будет работать триггер или нет. Главное, чтобы он при своей нерабочести не вызывал невозможности выполнять операции U/D/I над таблицей. Как я понял, триггер "не обязательный для выполнения" ...
Создаешь вспомогательныю таблицу, в которую из триггера помещаются команды - тот скрипт, который должен работать внутри триггера. Один раз в минуту срабатывает задание, которое просматривает эту таблицу и выполняет упавшие в таблицу команды, после чего их оттуда удаляет. Выполнятся команды успешно или нет - дело десятое (в принципе, можно помещать флаг успешности вывполнения команды в эту таблицу и НЕ удалять из нее неуспешно выполненные команды). Решение неуклюжее, посольку таблицами inserted и deleted пользоваться нельзя. А как ты хотел? Ведь их структура изменяется вместе со структурой базовой таблицы...
...
Рейтинг: 0 / 0
Обработка ошибки внутри триггера.
    #32007584
Фотография judge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2alexeyvg:

Может (должен) запустить - но если не запустит проверка нужна для подстраховки, чтобы база не разъехалась. (Я думаю что это просто будет опционально. Если Очень важно чтобы все работало - то вставляется доп. проверка на структуру таблиц.

2garya:

Как раз из-за того, что inserted & deleted изменяются вместе со структурой таблицы, я и хочу делать проверки чтобы небыло ошибок. Ваш вариант очень интересный, но в моем случае к сожалению не подойдет (из за изменения структуры inserted&deleted).

PS. Когда все будет готово я дам ссылку на тестовую версию - может быть кому-нибудь будет интересно поиграться.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Обработка ошибки внутри триггера.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]