Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проверка на UNIQUE в триггере / 13 сообщений из 13, страница 1 из 1
16.08.2004, 12:40:52
    #32650714
mko
mko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
почему не работает запрос вида (FB1.5, триггер BeforeInsertUpdate) :

Код: plaintext
1.
select count("ID_FK"), "ID_FK", "NUM"  from TABLE1  where "ID_FK"=new."ID_FK" and "NUM"=new."NUM"
into :REC_COUNT, oldID_FK, oldNUM;


IB Expert говорит:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

идея вообще-то в следуюшем, есть UNIQUE(ID_FK, NUM),
пытаюсь выбрасывать exeptions при попытке внесения записи со значениями, которые уже существуют, а также при редактирование по аналогии, перед exeptionсом сервака про UNIQUE

хотел сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TRIGGER ORDERS_B_IU FOR ORDERS
ACTIVE BEFORE INSERT OR UPDATE POSITION  0 
AS
declare variable REC_COUNT smallint;
declare variable oldID_FK  integer;
declare variable oldNUM varchar( 15 );

begin
select count("ID_FK"), "ID_FK", "NUM"  from TABLE1  where "ID_FK"=new."ID_FK" and "NUM"=new."NUM"
into :REC_COUNT, oldID_FK, oldNUM;
if (inserting) and (REC_COUNT> 0 ) then exception EXIST_ID_FK_ORDERS;
if (updating) and (REC_COUNT= 1 ) and (....) then exception EXIST_ID_FK_ORDERS;
end

пока писал топик, уже понял что так как задумал не получится, всё равно при редактировании поля отличного от ID_KF или NUM выдаст exceptions, подскажите плз. как реализовать проверку на updating
...
Рейтинг: 0 / 0
16.08.2004, 12:54:47
    #32650749
Серега
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
А нафига все это?
...
Рейтинг: 0 / 0
16.08.2004, 12:57:49
    #32650758
Dik76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
Код: plaintext
1.
2.
3.
select count("ID_FK"), "ID_FK", "NUM"  from TABLE1
 where "ID_FK"=new."ID_FK" and "NUM"=new."NUM"
into :REC_COUNT, oldID_FK, oldNUM;
Почему ошибку выдает понятно count("ID_FK") - это агрегирующая функция, если ты хочешь другие поля выводить то надо group by использовать.
...
Рейтинг: 0 / 0
16.08.2004, 13:08:21
    #32650787
Лентяй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
Ну и до кучиn - двоеточия неплохо бы поставить для всех переменных после INTO.
...
Рейтинг: 0 / 0
16.08.2004, 13:10:49
    #32650792
Лентяй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
Да и вообщем-то дурью ты маешься...
...
Рейтинг: 0 / 0
16.08.2004, 13:11:13
    #32650793
mko
mko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
СерегаА нафига все это?

программа ориентирована на "очень" продвинутых пользователей и когда они увидят Message типа:

violation of PRIMARY or UNIQUE KEY constraint "UNQ_REC_ORDERS" on table "ORDERS"

каждый будет звонить и говорить "программа не работает!"
после популярных объяснений в чем, на самом деле, причина появления сего сообщения, через неделю пользователь забывает что я ему пояснял, и по новой, так что я решил в своих exeptionsах сервера выводить подробнейшее описание причины отказа добавления/редактирования ORDERS

Dik76Почему ошибку выдает понятно count("ID_FK") - это агрегирующая функция, если ты хочешь другие поля выводить то надо group by использовать.
это я понял, подкиньте идею проверки на уникальность при редактировании !!
...
Рейтинг: 0 / 0
16.08.2004, 13:12:58
    #32650799
mko
mko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
ЛентяйНу и до кучиn - двоеточия неплохо бы поставить для всех переменных после INTO.
ну писал я прямо в браузере триггер, - пропустил двоеточия, да и скобки в if
...
Рейтинг: 0 / 0
16.08.2004, 14:06:26
    #32650938
Лкшы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
То, что ты написал - работает только при всавке.
При изменении - проверку производить только при отличии old и new ID_FK или NUM.
Да и проверять лучше через if(exists(select 1 from table1 where ...)) then exception
...
Рейтинг: 0 / 0
16.08.2004, 14:06:55
    #32650940
Серега
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
mko
программа ориентирована на "очень" продвинутых пользователей и когда они увидят Message типа:

violation of PRIMARY or UNIQUE KEY constraint "UNQ_REC_ORDERS" on table "ORDERS"

каждый будет звонить и говорить "программа не работает!"

Для этого можно поймать исключение и "перевести" текст его сообщения на доходчивое для юзера. И/Или построить работу так, что юзер не сможет ввести неправильно. А перепроверять работу констрейнта - ну уж нафиг.
...
Рейтинг: 0 / 0
16.08.2004, 15:13:18
    #32651102
Dik76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
Серега прав, проверять работу констрейнтов ни к чему.
авторviolation of PRIMARY or UNIQUE KEY constraint "UNQ_REC_ORDERS" on table "ORDERS"
каждый будет звонить и говорить "программа не работает!"
Если интересно как делаю я обработку ошибок:
есть табличка в которой хранятся тексты ошибок (код ошибки, имя констрейнта, текст сообщения), есть дельфовый обработчик ошибок, который при возникновении ошибки ищит соответствующий код и имя констрейнта, если не находит, то ищит просто код (код с пустым именем констрейнта содержит типовое сообщение) и выводит сообщение, если ни чего не найдено выводит, то выводит текст полученный изначально. Вся обработка основанна на синтаксическом разборе сообщений. Это дело повзаимствованно из ODAC.
...
Рейтинг: 0 / 0
16.08.2004, 15:13:29
    #32651103
mko
mko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
СерегаДля этого можно поймать исключение и "перевести" текст его сообщения на доходчивое для юзера.

Рациональное предложение :))

нашел я этот exeption

SQLCODE codes and messages
SQLCODE=-803
Number=335544665L


InterBase status array error codes:
Error code=isc_unique_key_violation
Number=335544665L

а как его "обработать" и по его возникновению, не показывая, заменить своим (на сервере)??
...
Рейтинг: 0 / 0
16.08.2004, 15:16:34
    #32651113
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
mkoа как его "обработать" и по его возникновению, не показывая, заменить своим (на сервере)??У тебя юзеры работают с сервером напрямую ?
Или таки имеет место быть аппликация?
Если таки второе, то зачем самому себе усложнять жизнь?
...
Рейтинг: 0 / 0
16.08.2004, 15:27:09
    #32651143
mko
mko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка на UNIQUE в триггере
подозреваю что можна сделать так:

Код: plaintext
1.
2.
3.
4.
5.
CREATE TRIGGER ORDERS_B_IU FOR ORDERS
ACTIVE ????? INSERT OR UPDATE POSITION  0 
AS
begin
  if (sqlcode=- 803 ) then exception EXIST_ID_FK_ORDERS;
end

только вот вопрост где?? не в BeforeInsUpd не в AfterInsUpd ясно что не сработает...

МимопроходящийУ тебя юзеры работают с сервером напрямую?
Или таки имеет место быть аппликация?
Если таки второе, то зачем самому себе усложнять жизнь?

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


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