Ошибки уникального ключа в FireBird 1.5.2.4731
Ошибки уникального ключа в FireBird 1.5.2.4731
Сейчас у меня 1.5.2.4731 и все равно периодически падает уникальный ключ структуры Integer-Integer-Char(1)-Integer-Integer, т.е. вводится двойная запись, после этого все падает и лечится только DELETE FROM. Тянется это с версии 1.0. Обещали исправить в новой версии - тщетно. И КОГДА ЭТО КОНЧИТСЯ??? Программа работает на ~ 300 серверах в 4 областях и раза 2 в месяц такая байда, хотя операторы изо-всех сил стремятся не ошибаться, зная этот глюк. Как надоело выслушивать претензии... Интересно MS SQL такое допускает?
Что значит поподробнее?
Питание не выкл., ресет не нажимался, все в процессе работы.
Нажимается кн."Новая", вводится новый № накладной, нажимается кн."ОК". С неправильным номером эта сволочь сохраняет без положенной ругани. Оператор опять нажимает кн."Новая" - тут болт на 22. Кн."Новая" и "ОК" работают через ХП. Редактирование - в экранной форме не связанной с БД. Это не первичный ключ, а уникальный (первичный ключ - № записи в БД).
Питание не выкл., ресет не нажимался, все в процессе работы.
Нажимается кн."Новая", вводится новый № накладной, нажимается кн."ОК". С неправильным номером эта сволочь сохраняет без положенной ругани. Оператор опять нажимает кн."Новая" - тут болт на 22. Кн."Новая" и "ОК" работают через ХП. Редактирование - в экранной форме не связанной с БД. Это не первичный ключ, а уникальный (первичный ключ - № записи в БД).
Уникальность естественного ключа (номер накладной) какими силами поддерживается? Силами уникального индекса или запроса в ХП на существование? Если первое - ищи нарушения в администрировании, ведущие к повреждению индекса. Не в момент ввода этой накладной, а вчера, позавчера, месяц назад. На этом месте на момент ввода индекс уже поломан. Если второе, то просто готовься получить канделябром.Fran_VV писал(а):Что значит поподробнее?
Питание не выкл., ресет не нажимался, все в процессе работы.
Нажимается кн."Новая", вводится новый № накладной, нажимается кн."ОК". С неправильным номером эта сволочь сохраняет без положенной ругани. Оператор опять нажимает кн."Новая" - тут болт на 22. Кн."Новая" и "ОК" работают через ХП. Редактирование - в экранной форме не связанной с БД. Это не первичный ключ, а уникальный (первичный ключ - № записи в БД).
>Если первое - ищи нарушения в администрировании, ведущие к повреждению индекса. Не в момент ввода этой накладной, а вчера, позавчера, месяц назад. На этом месте на момент ввода индекс уже поломан.
Это как он может быть поломан месяц назад? Работа идет непрерывно.
И как эту поломатость искать? Слежении за уникальностью идет на уровне ключа, в ХП стоит UPDATE xxxx SET .... и все значения подряд из экранной формы.
Это как он может быть поломан месяц назад? Работа идет непрерывно.
И как эту поломатость искать? Слежении за уникальностью идет на уровне ключа, в ХП стоит UPDATE xxxx SET .... и все значения подряд из экранной формы.
При падениях сервера, выключениях питания топором, и т.п. некорректных завершениях. Как всегда, FW On снижает вероятность. В более ранних версиях были какие-то варианты при каких-то фокусах в триггерах, плохо помню, вроде бы с помощью какого-то хитрого применения EXIT в триггере.Fran_VV писал(а):>Если первое - ищи нарушения в администрировании, ведущие к повреждению индекса. Не в момент ввода этой накладной, а вчера, позавчера, месяц назад. На этом месте на момент ввода индекс уже поломан.
Это как он может быть поломан месяц назад? Работа идет непрерывно.
А вот так и искать - запись в базе присутствует, при поиске натуралом находится, по индексу - нет. Если база эксплуатируется в жёстких условиях - чаще делать b/r, если индекс сломан, но дубликаты данных ещё не появились из за этого при дальнейшей работе, то всё тихо и мирно чинится, если уже появились - получаешь ошибку на ресторе и чинишь ручками, т.е. ищешь их натуралом и принимаешь решение что с ними делать, то ли апдейтить опять же с натуральным планом, то ли удалять по rdb$db_key.Fran_VV писал(а): И как эту поломатость искать?
Я же говорил, все лечится DELETE FROM WHERE (№=nnn).
А натурал (ну не знаю, что под этим понимать) в IBExperte тоже не работает - как только пытаешься встать на эту запись - IBExpert виснет напрочь. И пользователи не знают, что такое IBExpert и gfix. Пришлось им спец программку написать для этих глюков. Интересно MS SQL такое допускает безобразие?
А натурал (ну не знаю, что под этим понимать) в IBExperte тоже не работает - как только пытаешься встать на эту запись - IBExpert виснет напрочь. И пользователи не знают, что такое IBExpert и gfix. Пришлось им спец программку написать для этих глюков. Интересно MS SQL такое допускает безобразие?
И удаляется одна запись? Короче. Структуру таблицы с констрейнтами и индексами в студию.Fran_VV писал(а):Я же говорил, все лечится DELETE FROM WHERE (№=nnn).
поиск записи не по индексу.Fran_VV писал(а): А натурал (ну не знаю, что под этим понимать)
от слова IBExpert у меня уже начинает скулы сводить. Не потому что плохой инструмент, а потому что прогрессирует в сторону замещения мозгов у программеров. Ну бито что-то в базе, понимаешь, би-то. И не в момент вставки этой записи, она жертва. А что бито - есть средства узнать. Не для пользователя, конечно.Fran_VV писал(а): в IBExperte тоже не работает - как только пытаешься встать на эту запись - IBExpert виснет напрочь.
Да. Сюда скрипт метаданных для таблицы по которой UK (и его в том числе).Fran_VV писал(а): Что значит это выражение - скрипт CREATE TABLE прислать? И куда?
Почитай http://www.ibase.ru/devinfo/db_repair.htmFran_VV писал(а): И какими средствами?
И как узнать? БД у меня нет, прислать ее по эл.почте проблема - или почты нет или БД > 100МБ
Я бы попробовал UK перестроить...
Умные вы все такие, я же сказал - нет у меня этой упавшей БД. А все рекомендации я знаю уже лет 6.Лысый писал(а):Да. Сюда скрипт метаданных для таблицы по которой UK (и его в том числе).Fran_VV писал(а): Что значит это выражение - скрипт CREATE TABLE прислать? И куда?
Почитай http://www.ibase.ru/devinfo/db_repair.htmFran_VV писал(а): И какими средствами?
И как узнать? БД у меня нет, прислать ее по эл.почте проблема - или почты нет или БД > 100МБ
Я бы попробовал UK перестроить...
А вот вам и скрипт:
Код: Выделить всё
CREATE TABLE REGROD (
REC_NO "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
BOOK "IntSmall_0" DEFAULT 0 NOT NULL /* "IntSmall_0" = SMALLINT DEFAULT 0 NOT NULL */,
NAKT "Int_1" DEFAULT 0 NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
ADOP "IntSmall_0" DEFAULT 0 NOT NULL /* "IntSmall_0" = SMALLINT DEFAULT 0 NOT NULL */,
BUKA "Char1" DEFAULT '' NOT NULL COLLATE PXW_CYRL /* "Char1" = CHAR(1) DEFAULT '' NOT NULL */,
DAKT "DateToday" DEFAULT 'TODAY' /* "DateToday" = DATE DEFAULT 'TODAY' NOT NULL */,
FAMB FIO_TEXT NOT NULL COLLATE PXW_CYRL /* FIO_TEXT = VARCHAR(30) DEFAULT '' NOT NULL */,
NAMB FIO_TEXT NOT NULL COLLATE PXW_CYRL /* FIO_TEXT = VARCHAR(30) DEFAULT '' NOT NULL */,
OTB FIO_TEXT NOT NULL COLLATE PXW_CYRL /* FIO_TEXT = VARCHAR(30) DEFAULT '' NOT NULL */,
POL "IntSmall_1" DEFAULT 1 NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
DATAB "DateToday" DEFAULT 'TODAY' NOT NULL /* "DateToday" = DATE DEFAULT 'TODAY' NOT NULL */,
MRB_STA "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MRB_OBL "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MRB_RAY "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MRB_NPR "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MRB_TEXT LINETEXT100 NOT NULL COLLATE PXW_CYRL /* LINETEXT100 = VARCHAR(100) DEFAULT '' NOT NULL */,
N1 "IntSmall_1" DEFAULT 1 NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
N3 "IntSmall_1" DEFAULT 1 NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
N2 "IntSmall_0" DEFAULT 0 NOT NULL /* "IntSmall_0" = SMALLINT DEFAULT 0 NOT NULL */,
N4 "IntSmall_1" DEFAULT 1 NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
PD_BABY "Char5" DEFAULT '' NOT NULL COLLATE PXW_CYRL /* "Char5" = CHAR(5) DEFAULT '' NOT NULL */,
PD_MOTHER "Char5" DEFAULT '' NOT NULL COLLATE PXW_CYRL /* "Char5" = CHAR(5) DEFAULT '' NOT NULL */,
PDEAD_TEXT LINETEXT300 NOT NULL COLLATE PXW_CYRL /* LINETEXT300 = VARCHAR(300) DEFAULT '' NOT NULL */,
VID_DOC_R "Int_1" DEFAULT 1 NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
TEXT_DOC_R LINETEXT100 NOT NULL COLLATE PXW_CYRL /* LINETEXT100 = VARCHAR(100) DEFAULT '' NOT NULL */,
DATA_DOC_R "DateNull" DEFAULT 'TODAY' /* "DateNull" = DATE DEFAULT null */,
SUD LINETEXT100 NOT NULL COLLATE PXW_CYRL /* LINETEXT100 = VARCHAR(100) DEFAULT '' NOT NULL */,
DATA_SUD "DateNull" /* "DateNull" = DATE DEFAULT null */,
FAMF FIO_TEXT NOT NULL COLLATE PXW_CYRL /* FIO_TEXT = VARCHAR(30) DEFAULT '' NOT NULL */,
NAMF FIO_TEXT NOT NULL COLLATE PXW_CYRL /* FIO_TEXT = VARCHAR(30) DEFAULT '' NOT NULL */,
OTF FIO_TEXT NOT NULL COLLATE PXW_CYRL /* FIO_TEXT = VARCHAR(30) DEFAULT '' NOT NULL */,
DATAF "DateNull" /* "DateNull" = DATE DEFAULT null */,
DATAF_TEXT LINETEXT20 COLLATE PXW_CYRL /* LINETEXT20 = VARCHAR(20) */,
VOZF "IntSmall_0" DEFAULT 0 NOT NULL /* "IntSmall_0" = SMALLINT DEFAULT 0 NOT NULL */,
GRAZF "IntSmall_1" DEFAULT 1 NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
NACF "IntSmall_1" DEFAULT 1 NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
MRF_STA "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MRF_OBL "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MRF_RAY "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MRF_NPR "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MRF_TEXT LINETEXT100 NOT NULL COLLATE PXW_CYRL /* LINETEXT100 = VARCHAR(100) DEFAULT '' NOT NULL */,
MGF_STA "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MGF_OBL "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MGF_RAY "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MGF_NPR "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MGF_STR "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MGF_HOM "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MGF_AP VCHAR_15 NOT NULL COLLATE PXW_CYRL /* VCHAR_15 = VARCHAR(15) DEFAULT '' NOT NULL */,
MGF_TEXT LINETEXT100 NOT NULL COLLATE PXW_CYRL /* LINETEXT100 = VARCHAR(100) DEFAULT '' NOT NULL */,
DOCF_COD "IntSmall_1" NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
DOCF_SER LINE_TEXT12 COLLATE PXW_CYRL /* LINE_TEXT12 = VARCHAR(12) DEFAULT NULL */,
DOCF_N DOC_DOMAIN COLLATE PXW_CYRL /* DOC_DOMAIN = VARCHAR(20) DEFAULT NULL */,
DOCF_DV "DateNull" /* "DateNull" = DATE DEFAULT null */,
DOCF_TEXT LINETEXT100 NOT NULL COLLATE PXW_CYRL /* LINETEXT100 = VARCHAR(100) DEFAULT '' NOT NULL */,
FAMM FIO_TEXT COLLATE PXW_CYRL /* FIO_TEXT = VARCHAR(30) DEFAULT '' NOT NULL */,
NAMM FIO_TEXT COLLATE PXW_CYRL /* FIO_TEXT = VARCHAR(30) DEFAULT '' NOT NULL */,
OTM FIO_TEXT COLLATE PXW_CYRL /* FIO_TEXT = VARCHAR(30) DEFAULT '' NOT NULL */,
DATAM "DateNull" /* "DateNull" = DATE DEFAULT null */,
DATAM_TEXT LINETEXT20 COLLATE PXW_CYRL /* LINETEXT20 = VARCHAR(20) */,
VOZM "IntSmall_0" DEFAULT 0 NOT NULL /* "IntSmall_0" = SMALLINT DEFAULT 0 NOT NULL */,
GRAZM "IntSmall_1" DEFAULT 1 NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
NACM "IntSmall_1" DEFAULT 1 NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
MRM_STA "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MRM_OBL "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MRM_RAY "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MRM_NPR "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MRM_TEXT LINETEXT100 COLLATE PXW_CYRL /* LINETEXT100 = VARCHAR(100) DEFAULT '' NOT NULL */,
MGM_STA "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MGM_OBL "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MGM_RAY "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */,
MGM_NPR "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MGM_STR "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MGM_HOM "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MGM_AP VCHAR_15 NOT NULL COLLATE PXW_CYRL /* VCHAR_15 = VARCHAR(15) DEFAULT '' NOT NULL */,
MGM_TEXT LINETEXT100 COLLATE PXW_CYRL /* LINETEXT100 = VARCHAR(100) DEFAULT '' NOT NULL */,
DOCM_COD "IntSmall_1" NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
DOCM_SER LINE_TEXT12 COLLATE PXW_CYRL /* LINE_TEXT12 = VARCHAR(12) DEFAULT NULL */,
DOCM_N DOC_DOMAIN COLLATE PXW_CYRL /* DOC_DOMAIN = VARCHAR(20) DEFAULT NULL */,
DOCM_DV "DateNull" /* "DateNull" = DATE DEFAULT null */,
DOCM_TEXT LINETEXT100 NOT NULL COLLATE PXW_CYRL /* LINETEXT100 = VARCHAR(100) DEFAULT '' NOT NULL */,
SVED "IntSmall_1" DEFAULT 1 NOT NULL /* "IntSmall_1" = SMALLINT DEFAULT 1 NOT NULL */,
SVEDTEXT LINETEXT100 COLLATE PXW_CYRL /* LINETEXT100 = VARCHAR(100) DEFAULT '' NOT NULL */,
NOMER_ZBRAKA "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
DATA_ZBRAKA "DateNull" /* "DateNull" = DATE DEFAULT null */,
FIOZ LINETEXT300 COLLATE PXW_CYRL /* LINETEXT300 = VARCHAR(300) DEFAULT '' NOT NULL */,
NSVID "Int_0" DEFAULT 0 NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
PRIM LINETEXT600 COLLATE PXW_CYRL /* LINETEXT600 = VARCHAR(600) DEFAULT '' NOT NULL */,
SERIA "Char12" DEFAULT '' NOT NULL COLLATE PXW_CYRL /* "Char12" = CHAR(12) DEFAULT '' NOT NULL */,
ZAGSRAY "Int_0" DEFAULT 0 NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
DATAB_ "DateNull" /* "DateNull" = DATE DEFAULT null */,
FAMB_ FIO_TEXT_ COLLATE PXW_CYRL /* FIO_TEXT_ = VARCHAR(30) */,
NAMB_ FIO_TEXT_ COLLATE PXW_CYRL /* FIO_TEXT_ = VARCHAR(30) */,
OTB_ FIO_TEXT_ COLLATE PXW_CYRL /* FIO_TEXT_ = VARCHAR(30) */,
FAMF_ FIO_TEXT_ COLLATE PXW_CYRL /* FIO_TEXT_ = VARCHAR(30) */,
NAMF_ FIO_TEXT_ COLLATE PXW_CYRL /* FIO_TEXT_ = VARCHAR(30) */,
OTF_ FIO_TEXT_ COLLATE PXW_CYRL /* FIO_TEXT_ = VARCHAR(30) */,
FAMM_ FIO_TEXT_ COLLATE PXW_CYRL /* FIO_TEXT_ = VARCHAR(30) */,
NAMM_ FIO_TEXT_ COLLATE PXW_CYRL /* FIO_TEXT_ = VARCHAR(30) */,
OTM_ FIO_TEXT_ COLLATE PXW_CYRL /* FIO_TEXT_ = VARCHAR(30) */,
SPECIALIST FIO_TEXT_ COLLATE PXW_CYRL /* FIO_TEXT_ = VARCHAR(30) */,
DATE_LAST "DTime" /* "DTime" = TIMESTAMP DEFAULT NULL */,
MRB_SOK "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MRF_SOK "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MGF_SOK "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MRM_SOK "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
MGM_SOK "Int_0" NOT NULL /* "Int_0" = INTEGER DEFAULT 0 NOT NULL */,
DATAB_TEXT LINETEXT20 DEFAULT '' NOT NULL COLLATE PXW_CYRL /* LINETEXT20 = VARCHAR(20) */,
REGYEAR "Int_1" NOT NULL /* "Int_1" = INTEGER DEFAULT 1 NOT NULL */
);
/******************************************************************************/
/**** Unique Constraints ****/
/******************************************************************************/
ALTER TABLE REGROD ADD CONSTRAINT REGROD_NABZY UNIQUE (NAKT, ADOP, BUKA, ZAGSRAY, REGYEAR);
/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/
ALTER TABLE REGROD ADD CONSTRAINT PK_REGROD PRIMARY KEY (REC_NO);
/******************************************************************************/
/**** Foreign Keys ****/
/******************************************************************************/
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_DOCF FOREIGN KEY (DOCF_COD) REFERENCES COD_DOCUM (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_DOCM FOREIGN KEY (DOCM_COD) REFERENCES COD_DOCUM (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_GRAZF FOREIGN KEY (GRAZF) REFERENCES COD_GRAZ (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_GRAZM FOREIGN KEY (GRAZM) REFERENCES COD_GRAZ (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_HOM_GF FOREIGN KEY (MGF_HOM) REFERENCES HOMES (DOM_COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_HOM_GM FOREIGN KEY (MGM_HOM) REFERENCES HOMES (DOM_COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_NACF FOREIGN KEY (NACF) REFERENCES COD_NACIONAL (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_NACM FOREIGN KEY (NACM) REFERENCES COD_NACIONAL (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_NPR_GF FOREIGN KEY (MGF_NPR) REFERENCES COD_NPR (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_NPR_GM FOREIGN KEY (MGM_NPR) REFERENCES COD_NPR (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_NPR_RB FOREIGN KEY (MRB_NPR) REFERENCES COD_NPR (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_NPR_RF FOREIGN KEY (MRF_NPR) REFERENCES COD_NPR (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_NPR_RM FOREIGN KEY (MRM_NPR) REFERENCES COD_NPR (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_OBL_GF FOREIGN KEY (MGF_OBL) REFERENCES COD_OBL (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_OBL_GM FOREIGN KEY (MGM_OBL) REFERENCES COD_OBL (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_OBL_RB FOREIGN KEY (MRB_OBL) REFERENCES COD_OBL (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_OBL_RF FOREIGN KEY (MRF_OBL) REFERENCES COD_OBL (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_OBL_RM FOREIGN KEY (MRM_OBL) REFERENCES COD_OBL (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_RAY_GF FOREIGN KEY (MGF_RAY) REFERENCES COD_RAY (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_RAY_GM FOREIGN KEY (MGM_RAY) REFERENCES COD_RAY (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_RAY_RB FOREIGN KEY (MRB_RAY) REFERENCES COD_RAY (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_RAY_RF FOREIGN KEY (MRF_RAY) REFERENCES COD_RAY (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_RAY_RM FOREIGN KEY (MRM_RAY) REFERENCES COD_RAY (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_SOK_GF FOREIGN KEY (MGF_SOK) REFERENCES COD_SOK (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_SOK_GM FOREIGN KEY (MGM_SOK) REFERENCES COD_SOK (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_SOK_RB FOREIGN KEY (MRB_SOK) REFERENCES COD_SOK (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_SOK_RF FOREIGN KEY (MRF_SOK) REFERENCES COD_SOK (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_SOK_RM FOREIGN KEY (MRM_SOK) REFERENCES COD_SOK (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_STA_GF FOREIGN KEY (MGF_STA) REFERENCES COD_STA (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_STA_GM FOREIGN KEY (MGM_STA) REFERENCES COD_STA (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_STA_RB FOREIGN KEY (MRB_STA) REFERENCES COD_STA (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_STA_RF FOREIGN KEY (MRF_STA) REFERENCES COD_STA (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_STA_RM FOREIGN KEY (MRM_STA) REFERENCES COD_STA (COD);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_STR_GF FOREIGN KEY (MGF_STR) REFERENCES STREETS (COD_STREET);
ALTER TABLE REGROD ADD CONSTRAINT FK_REGROD_STR_GM FOREIGN KEY (MGM_STR) REFERENCES STREETS (COD_STREET);
/******************************************************************************/
/**** Indices ****/
/******************************************************************************/
CREATE INDEX REGROD_DAKT ON REGROD (DAKT);
CREATE INDEX REGROD_FAMB ON REGROD (FAMB, NAMB);
CREATE INDEX REGROD_YEARS ON REGROD (REGYEAR);
А что раньше IB не было, например 4.5?kdv писал(а):"я знаю 6 лет" - чего ты знаешь 6 лет, если документ написан 2-3 года назад? почему у тебя по 5-6 одинаковых FK на таблице? зачем тебе идентификаторы в двойных кавычках, коли ты "уже 6 лет"?
ну и формулировка проблемы в первом письме, конечно, караул...
И где это Вы увидели 5-6 одинаковых FK(поля то разные)?
И не индефикаторы, а домены, и почему нет? Скрипт сделал IBExpert, а он имена доменов в кавычки засовывает.
А какая должна быть формулировка? Чтобы разработчиков и так называемых экспертов не обидеть?
Для справки: таких таблиц - 9, всего таблиц в БД - 122
ХП - 216
Индексов - 394
IB 4.5 - не было. Вернее был, для одной операционки, причем распространялся приватно. и не 6 лет, а лет 10 назад.А что раньше IB не было, например 4.5?
запросы ты мышью набиваешь?И не индефикаторы, а домены, и почему нет? Скрипт сделал IBExpert, а он имена доменов в кавычки засовывает.
нас-то как можно формулировкой обидеть? Ты как вопрос задашь, такой ответ и получишь. Ни больше, ни меньше. Догадаться, что ты там имел в виду - можно, но не всегда. Правильно заданный вопрос - половина ответа.А какая должна быть формулировка? Чтобы разработчиков и так называемых экспертов не обидеть?
Насколько я понял, во фразе
Fran_VV писал(а): Я же говорил, все лечится DELETE FROM WHERE (№=nnn).
роль № играло Rec_No? Тогда да, dimitr прав, PK цел, UK бит. Причины - эксплуатационные, возможно, железные, структура индекса тут ни при чём. Вот, смотри:
select first 10 rdb$index_name, count(*) from rdb$index_segments
group by rdb$index_name
order by 2 desc
RDB$INDEX_NAME COUNT
=============================== ===========
SOSTSKLOPER_BUH_OTTP 11
SOSTSKLOPER_BUH_PKLI 11
NOMENKL_PRIM 10
RDB$PRIMARY222 9
RDB$PRIMARY136 9
RDB$PRIMARY353 9
SOR_KTSCPLPULFC 9
SOSTSKLOP_BUH 9
SOR_SCPLPULKTFC 9
WIMP_SC_ALARM 9
Эта база живёт 9 лет, на всяких разных версиях IB/FB, повреждения именно индексов случались раза 3-4. Один раз односегментный, остальные 2-3 сегментные. Возможно, композиты легче повреждаются при авариных ситуациях, но тут я могу только гадать. В результате запись есть, в индексе её нет, а поскольку контроль уникальности основан на индексе, получается что можно вставить дубликат. Но повреждение индекса было раньше и по другой причине. Так что требуй логи FB с проблемных серверов, смотри когда и отчего там сервер падал и настаивай на применении УПС.
2 kdv - FK у него не одинаковые, просто однотипные ссылки для пары типа отправитель-получатель. Избыток их обусловлен несколько странной моделью хранения географии, но к рассматриваемой проблеме имхо отношения не имеет:
select first 10 rdb$relation_name, count(*) from rdb$indices
group by rdb$relation_name
order by 2 desc
RDB$RELATION_NAME COUNT
=============================== ===========
SC_LST 25
SCHET_TU 24
MARKS 23
CLAIMS 22
NOMENKL 21
SOSTSKLOPER 21
SOST_OTGR_REQ 21
SOSTLETTERS 20
CONTRACTS 18
OTGR_REQ 18
и ничо
Merlin- у:
>Я же говорил, все лечится DELETE FROM WHERE (№=nnn).
>роль № играло Rec_No? Тогда да, dimitr прав, PK цел, UK бит.
Да нет - удаление именно по UK:
DELETE FROM table
WHERE (NAKT=nnn)
AND (ADOP=xx)
AND (BUKA=y)
AND (ZAGSRAY=zzzz)
AND (REGYEAR=dddd)
Ведь пользователь не видит Rec_No, а знает только атрибуты акта, который нужно удалить. Поэтому насчет битого UK - большие сомнения.
Да, перед удалением я делаю:
SELECT COUNT(*) FROM table
WHERE (NAKT=nnn)
AND (ADOP=xx)
AND (BUKA=y)
AND (ZAGSRAY=zzzz)
AND (REGYEAR=dddd)
Message - Найдено две записи. Будем удалять?
И после этого - DELETE
>Я же говорил, все лечится DELETE FROM WHERE (№=nnn).
>роль № играло Rec_No? Тогда да, dimitr прав, PK цел, UK бит.
Да нет - удаление именно по UK:
DELETE FROM table
WHERE (NAKT=nnn)
AND (ADOP=xx)
AND (BUKA=y)
AND (ZAGSRAY=zzzz)
AND (REGYEAR=dddd)
Ведь пользователь не видит Rec_No, а знает только атрибуты акта, который нужно удалить. Поэтому насчет битого UK - большие сомнения.
Да, перед удалением я делаю:
SELECT COUNT(*) FROM table
WHERE (NAKT=nnn)
AND (ADOP=xx)
AND (BUKA=y)
AND (ZAGSRAY=zzzz)
AND (REGYEAR=dddd)
Message - Найдено две записи. Будем удалять?
И после этого - DELETE