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

0 views
Skip to first unread message

Andrei K.

unread,
Sep 7, 2013, 1:54:23 PM9/7/13
to ru-fi...@googlegroups.com
Добрый день,

Имеем две таблицы. Таблица А -- обычная, и Б - 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% загрузки в таск менеджере. Помогает только принудительное
завершение процесса.

Андрей

Simonov Denis

unread,
Sep 8, 2013, 6:23:40 AM9/8/13
to ru-fi...@googlegroups.com
Andrei K. <gs1994-Re5JQEe...@public.gmane.org> писал(а) в
своём письме Sat, 07 Sep 2013 21:54:23 +0400:
Как вам удалось создать внешний ключ на 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".

Vlad Khorsun

unread,
Sep 8, 2013, 10:47:45 AM9/8/13
to ru-fi...@googlegroups.com
"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% О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.

О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ ?

--
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫


Andrei K.

unread,
Sep 9, 2013, 8:09:48 AM9/9/13
to ru-fi...@googlegroups.com

Ниже приведен скрипт, в котором создается ФК (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

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

Andrei K.

unread,
Sep 9, 2013, 9:39:44 AM9/9/13
to ru-fi...@googlegroups.com
И еще, в догонку. К сожалению, такие ключи у нас уже просочились на важные базы
(расслабились мы со времен Яффила )). Так что простой запрет на создание
внешних ссылок из GTT на постоянные таблицы нас не спасает. Нужна именно
возможность удалить такой ключ. Чтобы сервер не падал при этом.

Спасибо.

Khorsun Vlad

unread,
Sep 9, 2013, 9:41:50 AM9/9/13
to ru-fi...@googlegroups.com
"Andrei K." ...

> О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ (at_fk_namespace_sync_nsk)
> О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.

О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫. О©╫О©╫О©╫-О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ isql О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ?

> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ 2.5.3 О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫ 2.5.0 О©╫ 2.5.2.

О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ 2.5.0 О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫...

О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.

--
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫

PS О©╫щё О©╫О©╫О©╫ - О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫ О©╫О©╫О©╫ - О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.


Andrei K.

unread,
Sep 9, 2013, 10:20:54 AM9/9/13
to ru-fi...@googlegroups.com

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

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

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

Andrei K.

unread,
Sep 9, 2013, 12:10:08 PM9/9/13
to ru-fi...@googlegroups.com

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

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...

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

Andrei K.

unread,
Sep 9, 2013, 2:01:22 PM9/9/13
to ru-fi...@googlegroups.com

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


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...


Vlad Khorsun

unread,
Sep 10, 2013, 5:08:44 AM9/10/13
to ru-fi...@googlegroups.com
"Andrei K." ...
>
> О©╫ О©╫О©╫О©╫О©╫О©╫ isql О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ IBExpert.
>
> О©╫ О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫,
> О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫?? О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
> О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ -- О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.

О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ FK, О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫.О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫её О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ FK. О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.

> О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ Firebird Foundation,
> О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.

О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ :)

Andrei K.

unread,
Sep 10, 2013, 5:41:39 AM9/10/13
to ru-fi...@googlegroups.com

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

спасибо!
Reply all
Reply to author
Forward
0 new messages