Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как создать триггер с проверкой по условию, со своим EXCEPTION (свое сообщ. на исключение) / 8 сообщений из 8, страница 1 из 1
30.05.2017, 13:53
    #39462297
Valdemarius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать триггер с проверкой по условию, со своим EXCEPTION (свое сообщ. на исключение)
Подскажите кто-нибудь...
Есть таблица ( t_customer ).
В таблице есть поле ( c_num ), следующего вида 0105201715001. Это поле генерируется (день, месяц, год, час, 001-номер), в котором значения иногда могу дублироваться - если в течение 1 часа повторно сохранить документ с одинаковым номером.
В этом случае БД Firebird показывает ошибку, т.к. срабатывает ограничение - созданный мною уникальный индекс ( UNQ3_T_CUSTOMER -> c_num ).

Хочу обработать ошибку и выдать свое сообщение пользователю, вместо сообщения, выдаваемого БД по умолчанию.

Для этого создал свое исключение ( UNQ3_T_CUSTOMER_EXCEPTION ).
Теперь хочу добавить триггер с проверкой по условию, но не знаю как.

Примерно делал так:

as
begin
/*Поиск дубликатов номеров*/
select t_customer.c_num, count(t_customer.c_num)
from t_customer
group by t_customer.c_num
having count(*) > 1

if (count > 1) then
begin
exception UNQ3_T_CUSTOMER_EXCEPTION;
suspend;
end
end

Но это не правильно. Зашел в тупик...
...
Рейтинг: 0 / 0
30.05.2017, 13:56
    #39462300
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать триггер с проверкой по условию, со своим EXCEPTION (свое сообщ. на исключение)
Valdemarius,

какой ещё suspend в триггере?

Считать агрегаты в триггере противопоказано, особенно по той же самой таблице на которой триггер. Для таких задач лучше UNIQUE CONSTRAINT
...
Рейтинг: 0 / 0
30.05.2017, 13:58
    #39462304
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать триггер с проверкой по условию, со своим EXCEPTION (свое сообщ. на исключение)
Hello, Valdemarius!

в таком виде это неработоспособно.
лови ошибку на клиенте и выдавай ему соответствующий текст.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.05.2017, 14:48
    #39462362
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать триггер с проверкой по условию, со своим EXCEPTION (свое сообщ. на исключение)
Код: sql
1.
exception UNQ3_T_CUSTOMER_EXCEPTION 'Моё сообщение об исключении';


Так не подойдет?
...
Рейтинг: 0 / 0
30.05.2017, 14:50
    #39462367
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать триггер с проверкой по условию, со своим EXCEPTION (свое сообщ. на исключение)
YuRock,

ты в суть поста не вник
...
Рейтинг: 0 / 0
30.05.2017, 14:55
    #39462374
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать триггер с проверкой по условию, со своим EXCEPTION (свое сообщ. на исключение)
Hello, Yurock!
You wrote on 30 мая 2017 г. 14:54:13:

Yurock> exception UNQ3_T_CUSTOMER_EXCEPTION 'Моё сообщение об исключении';
> Так не подойдет?ещё раз, для упёртых:
обеспечить целКостность на триггере (без весьма специфических телодвижений) НЕВОЗМОЖНО.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.05.2017, 15:11
    #39462392
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать триггер с проверкой по условию, со своим EXCEPTION (свое сообщ. на исключение)
Симонов ДенисYuRock,

ты в суть поста не вник
Да
...
Рейтинг: 0 / 0
30.05.2017, 15:15
    #39462397
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать триггер с проверкой по условию, со своим EXCEPTION (свое сообщ. на исключение)
Valdemarius,

Можно на клиенте обрабатывать примерно так (для IBX):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
try
  // UPDATE/INSERT ...
except
  on E: Exception do begin
    if E is EIBError then with ( E as EIBError ) do begin
      if ( IBErrorCode = isc_lock_conflict ) or ( IBErrorCode <> isc_unique_key_violation ) then begin
        ShowMessage( 'Документ обрабатывается другим пользователем' );
        Exit;
      end else
        raise;
    end else
      raise;
  end;
end;


И не надо никаких триггеров.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как создать триггер с проверкой по условию, со своим EXCEPTION (свое сообщ. на исключение) / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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