Проблема с FK и GTT

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

Проблема с FK и GTT

Andrei K
Добрый день,

Имеем две таблицы. Таблица А -- обычная, и Б - GLOBAL TEMPORARY TABLE ON COMMIT DELETE ROWS.
В таблице Б имеем внешний ключ на таблицу А.

Создаем чистую базу из скриптов. Добавляем одну запись в таблицу А. Таблица Б остается пустой.

Пытаемся удалить эту запись из таблицы А. Результат:

Firebird Embedded 2.5.2.26540 32 bit.

Вылетает с ошибкой:

internal consistency check (Too many savepoints (287), file: tra.cpp line 1347)

Firebird Embedded 2.5.3.26693 32 bit.

Зависает намертво. 0% загрузки в таск менеджере. Помогает только принудительное
завершение процесса.

Андрей

--
 
---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Проблема с FK и GTT

Simonov Denis
Andrei K. <[hidden email]> писал(а) в  
своём письме Sat, 07 Sep 2013 21:54:23 +0400:

> Добрый день,
>
> Имеем две таблицы. Таблица А -- обычная, и Б - GLOBAL TEMPORARY TABLE ON
> COMMIT DELETE ROWS.
> В таблице Б имеем внешний ключ на таблицу А.
>
> Создаем чистую базу из скриптов. Добавляем одну запись в таблицу А.  
> Таблица
> Б остается пустой.
>
> Пытаемся удалить эту запись из таблицы А. Результат:
>
> Firebird Embedded 2.5.2.26540 32 bit.
>
> Вылетает с ошибкой:
>
> internal consistency check (Too many savepoints (287), file: tra.cpp line
> 1347)
>
> Firebird Embedded 2.5.3.26693 32 bit.
>
> Зависает намертво. 0% загрузки в таск менеджере. Помогает только
> принудительное
> завершение процесса.
>
> Андрей
>

Как вам удалось создать внешний ключ на GLOBAL TEMPORARY TABLE ON COMMIT  
DELETE ROWS?

CREATE TABLE T (
     ID  INTEGER NOT NULL
);

ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);

CREATE GLOBAL TEMPORARY TABLE T2_GTT (
     ID    INTEGER NOT NULL,
     T_ID  INTEGER NOT NULL
) ON COMMIT PRESERVE ROWS;


ALTER TABLE T2_GTT ADD CONSTRAINT PK_T2_GTT PRIMARY KEY (ID);


ALTER TABLE T2_GTT
ADD CONSTRAINT FK_T2_GTT_T
FOREIGN KEY (T_ID)
REFERENCES T(ID);

This operation is not defined for system tables.
unsuccessful metadata update.
global temporary table "T2_GTT" of type ON COMMIT PRESERVE ROWS cannot  
reference persistent table "T".

--

---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.

Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Проблема с FK и GTT

Vlad Khorsun
In reply to this post by Andrei K
"Andrei K." ...
> Добрый день,
>
> Имеем две таблицы. Таблица А -- обычная, и Б - GLOBAL TEMPORARY TABLE ON
> COMMIT DELETE ROWS.
> В таблице Б имеем внешний ключ на таблицу А.

    Вот тут кто-то что-то путает.

> Создаем чистую базу из скриптов. Добавляем одну запись в таблицу А. Таблица
> Б остается пустой.
>
> Пытаемся удалить эту запись из таблицы А. Результат:
>
> Firebird Embedded 2.5.2.26540 32 bit.
>
> Вылетает с ошибкой:
>
> internal consistency check (Too many savepoints (287), file: tra.cpp line
> 1347)
>
> Firebird Embedded 2.5.3.26693 32 bit.

    А если не embedded ?

> Зависает намертво. 0% загрузки в таск менеджере. Помогает только
> принудительное
> завершение процесса.

    Раз уж создавали БД из скриптов, то есть возможность выделить минимальный
воспроизводимый пример ?

--
Хорсун Влад


--

---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.

Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Проблема с FK и GTT

Andrei K

Ниже приведен скрипт, в котором создается ФК (at_fk_namespace_sync_nsk)
из временной таблицы на постоянную.

Удалить такой констрэйнт уже нельзя. Ниже приведена команда, которая
валит программу (при использовании встроенного сервера) или сервер
(при сетевом подключении).

Если вставить записи во временную таблицу -- они вставятся, но при попытке
удалить запись из основной, на которую указывает внешний ключ,
сервер виснет.

Бэкап-рестор базы данных не помогает.

Проверено на последних версиях 2.5.3 из снэпшота, а также
на 2.5.0 и 2.5.2. Проверялось на 32bit embedded и на 64 bit classic server.

Заранее спасибо за помощь.

=============================================================

SET NAMES WIN1251;                       
SET SQL DIALECT 3;                       
CREATE DATABASE 'put_your_database_name' 
USER 'SYSDBA' PASSWORD 'masterkey'        
PAGE_SIZE 8192                           
DEFAULT CHARACTER SET WIN1251; 

CREATE DOMAIN dintkey
  AS INTEGER NOT NULL
  CHECK (VALUE > 0);

CREATE DOMAIN dtext255
  AS VARCHAR(255) CHARACTER SET WIN1251 COLLATE PXW_CYRL;

CREATE DOMAIN dtext20
  AS VARCHAR(20) CHARACTER SET WIN1251 COLLATE PXW_CYRL;

CREATE DOMAIN dboolean
  AS SMALLINT
  DEFAULT 0
  CHECK ((VALUE IS NULL) OR (VALUE IN (0, 1)));

CREATE DOMAIN dboolean_notnull
  AS SMALLINT
  DEFAULT 0
  NOT NULL
  CHECK (VALUE IN (0, 1));

CREATE DOMAIN dblobtext80_1251
  AS BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET win1251;

CREATE DOMAIN dname
  AS VARCHAR(60) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL;

CREATE DOMAIN dclassname
  AS VARCHAR(40) CHARACTER SET WIN1251 COLLATE PXW_CYRL;

CREATE DOMAIN dtext60
  AS VARCHAR(60) CHARACTER SET WIN1251 COLLATE PXW_CYRL;

CREATE DOMAIN dinteger_notnull
  AS INTEGER NOT NULL;

CREATE DOMAIN dinteger
  AS INTEGER;

CREATE DOMAIN dforeignkey
  AS INTEGER;


CREATE TABLE at_namespace (
  id            dintkey,
  name          dtext255 NOT NULL UNIQUE,
  caption       dtext255,
  filename      dtext255,
  filetimestamp TIMESTAMP,
  version       dtext20 DEFAULT '1.0.0.0' NOT NULL,
  dbversion     dtext20,
  optional      dboolean_notnull DEFAULT 0,
  internal      dboolean_notnull DEFAULT 1,
  comment       dblobtext80_1251,
  settingruid   VARCHAR(21),

  CONSTRAINT at_pk_namespace PRIMARY KEY (id)
);

CREATE GLOBAL TEMPORARY TABLE at_namespace_file (
  filename      dtext255,
  filetimestamp TIMESTAMP,
  filesize      dinteger,
  name          dtext255 NOT NULL UNIQUE,
  caption       dtext255,
  version       dtext20,
  dbversion     dtext20,
  optional      dboolean_notnull DEFAULT 0,
  internal      dboolean_notnull DEFAULT 1,
  comment       dblobtext80_1251,
  xid           dinteger,
  dbid          dinteger,

  CONSTRAINT at_pk_namespace_file PRIMARY KEY (filename)
)
  ON COMMIT DELETE ROWS;

CREATE GLOBAL TEMPORARY TABLE at_namespace_sync (
  namespacekey  dforeignkey,
  filename      dtext255,
  operation     CHAR(2) DEFAULT '  ' NOT NULL,

  CONSTRAINT at_fk_namespace_sync_nsk
    FOREIGN KEY (namespacekey) REFERENCES at_namespace (id),
  CONSTRAINT at_fk_namespace_sync_fn
    FOREIGN KEY (filename) REFERENCES at_namespace_file (filename)
      ON UPDATE CASCADE
      ON DELETE CASCADE,
  CONSTRAINT at_chk_namespace_sync_op
    CHECK (operation IN ('  ', '< ', '> ', '>>', '<<', '==', '=>', '<=', '! ', '? '))
)
  ON COMMIT DELETE ROWS;

======================================================

alter table at_namespace_sync drop constraint at_fk_namespace_sync_nsk

======================================================

--
 
---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Проблема с FK и GTT

Andrei K
И еще, в догонку. К сожалению, такие ключи у нас уже просочились на важные базы
(расслабились мы со времен Яффила )). Так что простой запрет на создание
внешних ссылок из GTT на постоянные таблицы нас не спасает. Нужна именно
возможность удалить такой ключ. Чтобы сервер не падал при этом.

Спасибо.

--
 
---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Проблема с FK и GTT

Vlad Khorsun
In reply to this post by Andrei K
"Andrei K." ...

> Ниже приведен скрипт, в котором создается ФК (at_fk_namespace_sync_nsk)
> из временной таблицы на постоянную.

    Нельзя создать такой ФК, это и есть бага. Где-то, видимо, метаданные
не полные читаются. Ты ведь этот скрипт из isql выполняешь, в одном коннекте ?

> Проверено на последних версиях 2.5.3 из снэпшота, а также
> на 2.5.0 и 2.5.2.

    Странно, что 2.5.0 тоже с багой...

Проверю, отпишусь.

--
Хорсун Влад

PS Ещё раз - нельзя такие ФК создавать, ни по нашей доке, ни по стандарту.
Так что - убирай их у себя уже сейчас.


--

---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.

Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Проблема с FK и GTT

Andrei K

и через isql и через окно выполнения скриптов IBExpert.

я же не против, что нельзя. но, что мне делать с теми базами,
где он уже создался?? удалить его не получается.
сейчас попробовал не через команду, а напрямую -- через
системные таблицы. результат тот же -- падение сервера.

готов сделать внеочередное пожертвование в Firebird Foundation,
но мне действительно надо решить эту проблему.

--
 
---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Проблема с FK и GTT

Andrei K

нашел дикий способ, как снести ФК для моей таблицы:

1) UPDATE RDB$RELATIONS SET RDB$RELATION_TYPE = 0 WHERE...

2) DELETE FROM RDB$REF_CONSTRAINTS WHERE ...

3) DELETE FROM RDB$RELATION_CONSTRAINTS WHERE ...

4) UPDATE RDB$RELATIONS SET RDB$RELATION_TYPE = 5 WHERE...

чем это мне грозит в перспективе? структура БД не повредится?

--
 
---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Проблема с FK и GTT

Andrei K

или даже еще короче:

1) UPDATE RDB$RELATIONS SET RDB$RELATION_TYPE = 0 WHERE...

2) ALTER TABLE DROP CONSTRAINT ...

3) UPDATE RDB$RELATIONS SET RDB$RELATION_TYPE = 5 WHERE...


--
 
---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Проблема с FK и GTT

Vlad Khorsun
In reply to this post by Andrei K
"Andrei K." ...
>
> и через isql и через окно выполнения скриптов IBExpert.
>
> я же не против, что нельзя. но, что мне делать с теми базами,
> где он уже создался?? удалить его не получается.
> сейчас попробовал не через команду, а напрямую -- через
> системные таблицы. результат тот же -- падение сервера.

    Подробности будут в трекере. Сейчас, вкратце - оно падает только если таблица,
на которой ты удаляешь FK, не была загружена в кеш метаданных коннекта. Т.е.
сделай, например, холостой запрос из неё перед удалением FK. Решение в движке
постараюсь сегодня сделать.

> готов сделать внеочередное пожертвование в Firebird Foundation,
> но мне действительно надо решить эту проблему.

    Внеочередных жертв не нужно :)

--
Хорсун Влад


--

---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.

Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Reply | Threaded
Open this post in threaded view
|

Re: Проблема с FK и GTT

Andrei K

работает! с предварительным SELECTом.

спасибо!

--
 
---
Вы получили это сообщение, поскольку подписаны на группу gmane.comp.db.firebird.russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес [hidden email].
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.