Firebird: как узнать, какое ограничение нарушено?
От: IvanXXX  
Дата: 28.06.10 17:07
Оценка:
Доброго времени суток

Есть БД, в таблицах которой множество ограничений целостности, каждое из которых имеет заранее известное имя. Как узнать имя ограничения, вызвавшего исключение при выполнении ХП?

Есть таблица и ограничение:
CREATE TABLE NEW_TABLE (
    NUMBER  BIGINT,
    STRING  VARCHAR(64)
);

ALTER TABLE NEW_TABLE ADD CONSTRAINT CHK1_NEW_TABLE check (STRING IS NOT NULL);


Пример. Если использовать IBExpert для вставки в эту таблицу, то получим следующее:
insert into new_table(number, string) values(null, null);

Operation violates CHECK constraint  on view or table.
Operation violates CHECK constraint CHK1_NEW_TABLE on view or table NEW_TABLE.
At trigger 'CHECK_3941'.


Теперь пишу следующую ХП:
create procedure NEW_PROCEDURE (
    pNumber bigint,
    pString varchar(64))
returns (
    sql bigint,
   gds bigint,
   message varchar(4096))
as
begin
  insert into new_table(number, string) values(:pNumber, :pString);

  sql = 0;
  gds = 0;
  suspend;

  when any do
  begin
    sql = SQLCODE;
    gds = GDSCODE;
    VIOLATED_CHECK_NAME = FUNC(sql, gds); --- вот с этим проблема
    message = FUNC(VIOLATED_CHECK_NAME);
    suspend;
  end
end


На RSDN есть статья про обработку ошибок БД на примере именно Firebird (http://rsdn.ru/article/db/FBErrors.xml
Автор(ы): Лихачёв Владимир Николаевич
Дата: 26.04.2009
При разработке программ, работающих с БД, важным моментом является обработка ошибочных ситуаций и информативность сообщений, предназначенных для конечного пользователя. При сложной структуре БД формирование таких сообщений для каждой отдельной ситуации может требовать довольно значительных усилий. Обработка ошибок, основанная на анализе структуры БД, и с учётом различных специфических ситуации позволит уменьшить трудозатраты и повысить качество программного обеспечения.
), но там речь идет о формировании сообщения об ошибке на основании сообщения сервера. А вот последнего у меня как раз и нет!

Если кто-то в курсе, как решить вопрос, напишите, буду очень благодарен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.