Ошибки уникального ключа в FireBird 1.5.2.4731

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Fran_VV
Сообщения: 10
Зарегистрирован: 14 мар 2005, 11:00

Ошибки уникального ключа в FireBird 1.5.2.4731

Сообщение Fran_VV » 14 мар 2005, 11:12

Сейчас у меня 1.5.2.4731 и все равно периодически падает уникальный ключ структуры Integer-Integer-Char(1)-Integer-Integer, т.е. вводится двойная запись, после этого все падает и лечится только DELETE FROM. Тянется это с версии 1.0. Обещали исправить в новой версии - тщетно. И КОГДА ЭТО КОНЧИТСЯ??? Программа работает на ~ 300 серверах в 4 областях и раза 2 в месяц такая байда, хотя операторы изо-всех сил стремятся не ошибаться, зная этот глюк. Как надоело выслушивать претензии... Интересно MS SQL такое допускает?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 мар 2005, 12:19

а поподробнее?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 14 мар 2005, 13:33

kdv писал(а):а поподробнее?
Пажалста. На 300 серверах в 4-х областях то питание вырубят, то ресет нажмут, то в BSOD загонят. Примерно 2 раза в месяц по статистике летит индекс первичного ключа, видимо, на наиболее интенсивно обновляемой таблице.

Fran_VV
Сообщения: 10
Зарегистрирован: 14 мар 2005, 11:00

Сообщение Fran_VV » 14 мар 2005, 15:02

Что значит поподробнее?
Питание не выкл., ресет не нажимался, все в процессе работы.
Нажимается кн."Новая", вводится новый № накладной, нажимается кн."ОК". С неправильным номером эта сволочь сохраняет без положенной ругани. Оператор опять нажимает кн."Новая" - тут болт на 22. Кн."Новая" и "ОК" работают через ХП. Редактирование - в экранной форме не связанной с БД. Это не первичный ключ, а уникальный (первичный ключ - № записи в БД).

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 14 мар 2005, 15:14

Fran_VV писал(а):Что значит поподробнее?
Питание не выкл., ресет не нажимался, все в процессе работы.
Нажимается кн."Новая", вводится новый № накладной, нажимается кн."ОК". С неправильным номером эта сволочь сохраняет без положенной ругани. Оператор опять нажимает кн."Новая" - тут болт на 22. Кн."Новая" и "ОК" работают через ХП. Редактирование - в экранной форме не связанной с БД. Это не первичный ключ, а уникальный (первичный ключ - № записи в БД).
Уникальность естественного ключа (номер накладной) какими силами поддерживается? Силами уникального индекса или запроса в ХП на существование? Если первое - ищи нарушения в администрировании, ведущие к повреждению индекса. Не в момент ввода этой накладной, а вчера, позавчера, месяц назад. На этом месте на момент ввода индекс уже поломан. Если второе, то просто готовься получить канделябром.

Fran_VV
Сообщения: 10
Зарегистрирован: 14 мар 2005, 11:00

Сообщение Fran_VV » 14 мар 2005, 15:25

>Если первое - ищи нарушения в администрировании, ведущие к повреждению индекса. Не в момент ввода этой накладной, а вчера, позавчера, месяц назад. На этом месте на момент ввода индекс уже поломан.

Это как он может быть поломан месяц назад? Работа идет непрерывно.
И как эту поломатость искать? Слежении за уникальностью идет на уровне ключа, в ХП стоит UPDATE xxxx SET .... и все значения подряд из экранной формы.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 14 мар 2005, 16:01

Fran_VV писал(а):>Если первое - ищи нарушения в администрировании, ведущие к повреждению индекса. Не в момент ввода этой накладной, а вчера, позавчера, месяц назад. На этом месте на момент ввода индекс уже поломан.

Это как он может быть поломан месяц назад? Работа идет непрерывно.
При падениях сервера, выключениях питания топором, и т.п. некорректных завершениях. Как всегда, FW On снижает вероятность. В более ранних версиях были какие-то варианты при каких-то фокусах в триггерах, плохо помню, вроде бы с помощью какого-то хитрого применения EXIT в триггере.
Fran_VV писал(а): И как эту поломатость искать?
А вот так и искать - запись в базе присутствует, при поиске натуралом находится, по индексу - нет. Если база эксплуатируется в жёстких условиях - чаще делать b/r, если индекс сломан, но дубликаты данных ещё не появились из за этого при дальнейшей работе, то всё тихо и мирно чинится, если уже появились - получаешь ошибку на ресторе и чинишь ручками, т.е. ищешь их натуралом и принимаешь решение что с ними делать, то ли апдейтить опять же с натуральным планом, то ли удалять по rdb$db_key.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 14 мар 2005, 17:50

а перед танцами с натуралом все-таки посмотреть на вывод gfix...

Fran_VV
Сообщения: 10
Зарегистрирован: 14 мар 2005, 11:00

Сообщение Fran_VV » 16 мар 2005, 13:35

Я же говорил, все лечится DELETE FROM WHERE (№=nnn).
А натурал (ну не знаю, что под этим понимать) в IBExperte тоже не работает - как только пытаешься встать на эту запись - IBExpert виснет напрочь. И пользователи не знают, что такое IBExpert и gfix. Пришлось им спец программку написать для этих глюков. Интересно MS SQL такое допускает безобразие?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 16 мар 2005, 13:44

Fran_VV писал(а):Я же говорил, все лечится DELETE FROM WHERE (№=nnn).
И удаляется одна запись? Короче. Структуру таблицы с констрейнтами и индексами в студию.
Fran_VV писал(а): А натурал (ну не знаю, что под этим понимать)
поиск записи не по индексу.
Fran_VV писал(а): в IBExperte тоже не работает - как только пытаешься встать на эту запись - IBExpert виснет напрочь.
от слова IBExpert у меня уже начинает скулы сводить. Не потому что плохой инструмент, а потому что прогрессирует в сторону замещения мозгов у программеров. Ну бито что-то в базе, понимаешь, би-то. И не в момент вставки этой записи, она жертва. А что бито - есть средства узнать. Не для пользователя, конечно.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 16 мар 2005, 13:57

Merlin писал(а):
Fran_VV писал(а):Я же говорил, все лечится DELETE FROM WHERE (№=nnn).
И удаляется одна запись?
У него битый UK и целый PK. Поэтому тут все ОК - удалится одна запись.

Fran_VV
Сообщения: 10
Зарегистрирован: 14 мар 2005, 11:00

Сообщение Fran_VV » 16 мар 2005, 18:29

> Структуру таблицы с констрейнтами и индексами в студию.

Что значит это выражение - скрипт CREATE TABLE прислать? И куда?

> А что бито - есть средства узнать.

И какими средствами?
И как узнать? БД у меня нет, прислать ее по эл.почте проблема - или почты нет или БД > 100МБ

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 16 мар 2005, 22:23

Fran_VV писал(а): Что значит это выражение - скрипт CREATE TABLE прислать? И куда?
Да. Сюда скрипт метаданных для таблицы по которой UK (и его в том числе).
Fran_VV писал(а): И какими средствами?
И как узнать? БД у меня нет, прислать ее по эл.почте проблема - или почты нет или БД > 100МБ
Почитай http://www.ibase.ru/devinfo/db_repair.htm

Я бы попробовал UK перестроить...

Fran_VV
Сообщения: 10
Зарегистрирован: 14 мар 2005, 11:00

Сообщение Fran_VV » 17 мар 2005, 09:27

Лысый писал(а):
Fran_VV писал(а): Что значит это выражение - скрипт CREATE TABLE прислать? И куда?
Да. Сюда скрипт метаданных для таблицы по которой UK (и его в том числе).
Fran_VV писал(а): И какими средствами?
И как узнать? БД у меня нет, прислать ее по эл.почте проблема - или почты нет или БД > 100МБ
Почитай http://www.ibase.ru/devinfo/db_repair.htm

Я бы попробовал UK перестроить...
Умные вы все такие, я же сказал - нет у меня этой упавшей БД. А все рекомендации я знаю уже лет 6.

А вот вам и скрипт:

Код: Выделить всё

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);

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 мар 2005, 10:21

"я знаю 6 лет" - чего ты знаешь 6 лет, если документ написан 2-3 года назад? почему у тебя по 5-6 одинаковых FK на таблице? зачем тебе идентификаторы в двойных кавычках, коли ты "уже 6 лет"?
ну и формулировка проблемы в первом письме, конечно, караул...

Fran_VV
Сообщения: 10
Зарегистрирован: 14 мар 2005, 11:00

Сообщение Fran_VV » 17 мар 2005, 11:44

kdv писал(а):"я знаю 6 лет" - чего ты знаешь 6 лет, если документ написан 2-3 года назад? почему у тебя по 5-6 одинаковых FK на таблице? зачем тебе идентификаторы в двойных кавычках, коли ты "уже 6 лет"?
ну и формулировка проблемы в первом письме, конечно, караул...
А что раньше IB не было, например 4.5?
И где это Вы увидели 5-6 одинаковых FK(поля то разные)?
И не индефикаторы, а домены, и почему нет? Скрипт сделал IBExpert, а он имена доменов в кавычки засовывает.
А какая должна быть формулировка? Чтобы разработчиков и так называемых экспертов не обидеть?
Для справки: таких таблиц - 9, всего таблиц в БД - 122
ХП - 216
Индексов - 394

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 мар 2005, 12:40

А что раньше IB не было, например 4.5?
IB 4.5 - не было. Вернее был, для одной операционки, причем распространялся приватно. и не 6 лет, а лет 10 назад.
И не индефикаторы, а домены, и почему нет? Скрипт сделал IBExpert, а он имена доменов в кавычки засовывает.
запросы ты мышью набиваешь?
А какая должна быть формулировка? Чтобы разработчиков и так называемых экспертов не обидеть?
нас-то как можно формулировкой обидеть? Ты как вопрос задашь, такой ответ и получишь. Ни больше, ни меньше. Догадаться, что ты там имел в виду - можно, но не всегда. Правильно заданный вопрос - половина ответа.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 17 мар 2005, 13:06

Насколько я понял, во фразе
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

и ничо :)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 мар 2005, 13:23

2 kdv - FK у него не одинаковые, просто однотипные ссылки для пары типа отправитель-получатель. Избыток их обусловлен несколько странной моделью хранения географии, но к рассматриваемой проблеме имхо отношения не имеет:
я это потом углядел, извиняюсь, уж больно имена столбцов похожие.

Fran_VV
Сообщения: 10
Зарегистрирован: 14 мар 2005, 11:00

Сообщение Fran_VV » 17 мар 2005, 13:30

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

Ответить