Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / firebird batch script / 25 сообщений из 28, страница 1 из 2
18.04.2017, 22:53
    #39440528
зеленый админ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
Привет. Попробовал прогнать скрипт:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
CREATE OR ALTER PROCEDURE P_CREATE_TEST_TABLE
  (p_strRoot VARCHAR(30), p_strMasterRoot VARCHAR(30) = '')
AS
BEGIN
  -- creation part
  IF (NOT TABLE_EXISTS(p_strRoot)) THEN 
    EXECUTE STATEMENT
    (
      REPLACE
      (
        'CREATE TABLE %s
        (
          ID BIGINT NOT NULL,
          DATA VARCHAR(40),
          CONSTRAINT PK_%s$ID PRIMARY KEY (ID) USING INDEX IDX_%s$ID
        );', '%s', p_strRoot
      )
    );
  
  IF (p_strMasterRoot <> '') THEN
  BEGIN
    EXECUTE STATEMENT
    (
      REPLACE
      (
        REPLACE
        (
          'ALTER TABLE %0:s
            ADD MASTER_ID BIGINT NOT NULL,
            ADD CONSTRAINT FK_%0:s$MASTER_ID FOREIGN KEY (MASTER_ID)
              REFERENCES %1:s (ID) USING INDEX IDX_%0:s$MASTER_ID;
          ', '%0:s', p_strRoot
        ), '%1:s', p_strMasterRoot
      )
    );
  END
    
  IF (NOT GENERATOR_EXISTS('SEQ_' || p_strRoot)) THEN
    EXECUTE STATEMENT (REPLACE('CREATE SEQUENCE SEQ_%s;', '%s', p_strRoot));
  
  EXECUTE STATEMENT
  (
    REPLACE
    (
      'CREATE TRIGGER BRI_%s
        BEFORE INSERT ON %s
      AS
      BEGIN
        NEW.ID = GEN_ID(SEQ_%s, 1);
      END;', '%s', p_strRoot
    )
  );
END;

EXECUTE BLOCK
AS
BEGIN
  EXECUTE PROCEDURE P_CREATE_TEST_TABLE('ICE_TEST_MASTER', '');
  /*EXECUTE PROCEDURE P_CREATE_TEST_TABLE('ICE_TEST_DET1', 'ICE_TEST_MASTER');
  EXECUTE PROCEDURE P_CREATE_TEST_TABLE('ICE_TEST_DET2', 'ICE_TEST_MASTER');
  EXECUTE PROCEDURE P_CREATE_TEST_TABLE('ICE_TEST_DET3', 'ICE_TEST_MASTER');
  EXECUTE PROCEDURE P_CREATE_TEST_TABLE('ICE_TEST_DET2_1', 'ICE_TEST_DET2');
  */
END;



вернуло

автор. ERROR: unsuccessful metadata update
cannot create index IDX_ICE_TEST_MASTER$ID [ErrorCode=335544351, ObjName=""]


В БД нет ни таблиц, ни индексов. Более того, скрипт пару раз проганялся нормально. Что произошло?
Firebird 3.0.2
...
Рейтинг: 0 / 0
19.04.2017, 06:48
    #39440575
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
зеленый админ,

читай langref про DDL. Для выполнения большинства операторов DDL требуется commit. Некоторые выполняются только в момент commit.

Зачем тебе понадобилось так создавать таблицы? И зачем там ПК создается с using index? Тебя не устраивает имя индекса PK_%s$ID ? И вообще, зачем нужны "нумерованные" таблицы? Может, временные надо?
...
Рейтинг: 0 / 0
19.04.2017, 09:04
    #39440607
зеленый админ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
kdv,

у меня в посте только одна ошибка: firebird кидает ошибку во время commit. Остальное, по-моему несущественно
...
Рейтинг: 0 / 0
19.04.2017, 09:42
    #39440628
firebird batch script
Ему явно не нравится имя индекса "IDX_ICE_TEST_MASTER$ID"

А вообще с какой целью Вы вмешиваетесь и пытаетесь давать свои имена индексам. Тем более для primary key. Зачем это надо?
...
Рейтинг: 0 / 0
19.04.2017, 09:44
    #39440630
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
Какой-то непонятный метод решения непонятной проблемы.

Ты бы по-русски написал чего ты таки хочешь в итоге?
...
Рейтинг: 0 / 0
19.04.2017, 10:07
    #39440655
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
Антон КарасёвЕму явно не нравится имя индекса "IDX_ICE_TEST_MASTER$ID"

А вообще с какой целью Вы вмешиваетесь и пытаетесь давать свои имена индексам. Тем более для primary key. Зачем это надо?Пример 5.29 Руководства по языку SQL СУБД Firebird 2.5 от 6 сентября 2015 г.:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE PROJECT (
    PROJ_ID PROJNO NOT NULL,
    PROJ_NAME VARCHAR(20) NOT NULL UNIQUE USING DESC INDEX IDX_PROJNAME,
    PROJ_DESC BLOB SUB_TYPE 1,
    TEAM_LEADER EMPNO,
    PRODUCT PRODTYPE,
  CONSTRAINT PK_PROJECT PRIMARY KEY (PROJ_ID) USING INDEX IDX_PROJ_ID,
  FOREIGN KEY (TEAM_LEADER) REFERENCES EMPLOYEE (EMP_NO) USING INDEX IDX_LEADER
);
...
Рейтинг: 0 / 0
19.04.2017, 10:09
    #39440656
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
rdb_dev,

ты это к чему?
...
Рейтинг: 0 / 0
19.04.2017, 10:12
    #39440660
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
Симонов Денис, по моему, контекст вопроса и ответа очевиден.
...
Рейтинг: 0 / 0
19.04.2017, 10:16
    #39440664
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
Вот направление, дальше - копать самостоятельно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
EXECUTE BLOCK AS
  DECLARE VARIABLE P_SQL TYPE OF COLUMN TABL$R_COUNTRIES.NAME;
BEGIN
  -- Проверить существование таблицы и если нет - создать
  IF(NOT(EXISTS(
      SELECT RF.RDB$RELATION_ID
      FROM   RDB$RELATIONS RF
      WHERE  (TRIM(RF.RDB$RELATION_NAME) = 'TABL$_VERSION')
  )))THEN
    BEGIN
    P_SQL =
      'CREATE TABLE TABL$_VERSION (     '||ASCII_CHAR(13)||ASCII_CHAR(10)||
      '  ID          DOMN$PSTRING_50_ID '||ASCII_CHAR(13)||ASCII_CHAR(10)||
      ' ,PARENT_ID   DOMN$PSTRING_50    '||ASCII_CHAR(13)||ASCII_CHAR(10)||
      ' ,NAME        DOMN$PSTRING       '||ASCII_CHAR(13)||ASCII_CHAR(10)||
      ' ,FLAG_DELETE DOMN$BOOLEAN       '||ASCII_CHAR(13)||ASCII_CHAR(10)||
      ' ,DATE_COMMIT DOMN$DATETIME      '||ASCII_CHAR(13)||ASCII_CHAR(10)||
      '); ';
    EXECUTE STATEMENT :P_SQL;
    P_SQL =
      'ALTER TABLE TABL$_VERSION ADD CONSTRAINT C_PK$_VERSION_ID '||ASCII_CHAR(13)||ASCII_CHAR(10)||
      ' PRIMARY KEY (ID) USING INDEX INDX$_VERSION_ID;';
    EXECUTE STATEMENT :P_SQL;
    P_SQL = 'CREATE INDEX INDX$_VERSION_DATE_COMMIT ON TABL$_VERSION (DATE_COMMIT);';
    EXECUTE STATEMENT :P_SQL;
    P_SQL = 'CREATE INDEX INDX$_VERSION_PARENT_ID ON TABL$_VERSION (PARENT_ID);';
    EXECUTE STATEMENT :P_SQL;
    END

  -- проверить существование домена в таблице, если нет - создать
  IF(NOT(EXISTS(
      SELECT RF.RDB$FIELD_ID
      FROM   RDB$RELATION_FIELDS RF
      WHERE  (TRIM(RF.RDB$RELATION_NAME) = 'TABL$_LOCAL')
        AND  (TRIM(RF.RDB$FIELD_NAME)    = 'COL_ID')
  )))THEN
    BEGIN
    P_SQL ='ALTER TABLE TABL$_LOCAL ADD COL_ID DOMN$PSTRING_50_ID;  ';
    EXECUTE STATEMENT :P_SQL;
    END

  -- Проверить существование индекса
  IF(NOT(EXISTS(
      SELECT I.RDB$INDEX_NAME
      FROM   RDB$INDICES I
      WHERE  (TRIM(I.RDB$INDEX_NAME) = 'INDX$_LOCAL_COL_ID')
  )))THEN
    BEGIN
    P_SQL ='CREATE INDEX INDX$_LOCAL_COL_ID ON TABL$_LOCAL (COL_ID);';
    EXECUTE STATEMENT :P_SQL;
    END

  -- Проверить существование ограничение целостности данных
  IF(NOT(EXISTS(
      SELECT I.RDB$INDEX_NAME
      FROM   RDB$INDICES I
      WHERE  (TRIM(I.RDB$INDEX_NAME) = 'INDX$_LOCAL_MAIN')
  )))THEN
    BEGIN
    P_SQL ='ALTER TABLE TABL$_LOCAL ADD CONSTRAINT CUNQ$_LOCAL_MAIN '||
      ' UNIQUE (OBJ_ID, COL_ID, REC_ID, COUNTRY_ID) USING INDEX INDX$_LOCAL_MAIN;';
    EXECUTE STATEMENT :P_SQL;
    END
END
...
Рейтинг: 0 / 0
19.04.2017, 10:16
    #39440665
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
зеленый админ,

а зачем после каждого оператора точка с запятой стоит если он всё равно в ES выполняется?
...
Рейтинг: 0 / 0
19.04.2017, 12:29
    #39440812
зеленый админ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
Сорри опять же. Не выложил код зависимых процедур.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE FUNCTION GENERATOR_EXISTS(p_strGenName varchar(30))
  RETURNS BOOLEAN 
AS
BEGIN
  RETURN
    EXISTS
    (
      SELECT
        NULL
      FROM RDB$GENERATORS R
      WHERE
        R.RDB$GENERATOR_NAME = :p_strGenName AND
        R.RDB$SYSTEM_FLAG=0
    );
END;


CREATE FUNCTION TABLE_EXISTS(p_strTableName varchar(30))
  RETURNS BOOLEAN 
AS
BEGIN
  RETURN
    EXISTS
    (
      SELECT
        NULL
      FROM RDB$RELATIONS R
      WHERE
        R.RDB$RELATION_NAME = :p_strTableName AND
        R.RDB$SYSTEM_FLAG=0 AND
        R.RDB$RELATION_TYPE=0
    );
END;



прогнал код (выше + 1-ый пост) на новой БД - все работает. На старой - виснет коммит. Проверю потом еще провисшие транзакции. Отпишусь вечером.
...
Рейтинг: 0 / 0
19.04.2017, 12:31
    #39440817
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
зеленый админпрогнал код (выше + 1-ый пост) на новой БД - все работает. На старой - виснет коммит. Проверю потом еще провисшие транзакции. Отпишусь вечером.

а если указать параметры транзакции для скрипта:
isc_tpb_consistency
isc_tpb_write

ась?
...
Рейтинг: 0 / 0
19.04.2017, 19:33
    #39441195
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
зеленый админ,

не пудри мозги, ответь на мои вопросы 20412997 . Гланды через зад тоже иногда удобно вырезать.
...
Рейтинг: 0 / 0
19.04.2017, 20:15
    #39441207
зеленый админ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
1)
kdvчитай langref про DDL. Для выполнения большинства операторов DDL требуется commit. Некоторые выполняются только в момент commit.

Знаю, написал выше.

2) kdvЗачем тебе понадобилось так создавать таблицы? И зачем там ПК создается с using index? Тебя не устраивает имя индекса PK_%s$ID ? И вообще, зачем нужны "нумерованные" таблицы? Может, временные надо?

Мне так хочется. А что хочется и не запрещено - разрешено. Я их буду создавать и сносить 100500 раз. GTT - знаком, работал в другой СУБД. Меня пока интересуют регулярные.
...
Рейтинг: 0 / 0
19.04.2017, 20:39
    #39441214
зеленый админ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
ни открытых транзакций, ничего там нет подозрительного. Просто не работает.
...
Рейтинг: 0 / 0
19.04.2017, 20:53
    #39441216
зеленый админ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
Если кому интересно - вот ссылка на бд:
https://drive.google.com/file/d/0B4mLkzBXmYycNkgwNjB0VWIzN0E/view?usp=sharing
Хз что там не так. Напишите, если есть какие соображения
...
Рейтинг: 0 / 0
19.04.2017, 23:54
    #39441270
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
зеленый админМне так хочется. А что хочется и не запрещено - разрешено.
ну ок. только ddl создается по коммиту, причем несколько взаимосвязанных ddl в одной транзакции могут и не отработать.

Не запрещено - да, не запрещено. Но не работает - да, не работает. Исправят это? Может быть, когда-нибудь. Пока работает так, как я сказал. Можешь дальше долбить в стену головой.
...
Рейтинг: 0 / 0
20.04.2017, 00:39
    #39441272
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
kdvзеленый админМне так хочется. А что хочется и не запрещено - разрешено.ну ок. только ddl создается по коммиту, причем несколько взаимосвязанных ddl в одной транзакции могут и не отработать.Ничто не мешает использовать EXECUTE STATEMENT ... WITH AUTONOMOUS TRANSACTION.
...
Рейтинг: 0 / 0
20.04.2017, 04:28
    #39441298
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
Антон КарасёвЕму явно не нравится имя индекса "IDX_ICE_TEST_MASTER$ID"

А вообще с какой целью Вы вмешиваетесь и пытаетесь давать свои имена индексам. Тем более для primary key. Зачем это надо?

Что бы потом точно знать как этот индекс называется.
Ситуация может быть примерно такой.
Есть начальный скрипт создания базы.
Все дальнейшие изменения метаданных идут в виде скриптов-патчей которые последовательно накатываются на базу.
Бывает нужно удалить индекс, или принудительно на него сослаться. Если сервер проименует его на свое усмотрение то в скрипте-патче можно это усмотрение и не угадать. Теоретически если на все экземпляры базы накатывать строго одинаково и в промежутке ничем не лазить - то эти автогенеренные имена должны совпасть. Но жизнь обычно сложнее.

После того как я на этом накололся - создаю все констрейнты, даже PK - отдельной командой ALTER TABLE.
...
Рейтинг: 0 / 0
20.04.2017, 11:11
    #39441434
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
fraksЧто бы потом точно знать как этот индекс называется.
начиная с fb 1.5 абсолютно точно известно, что индекс для констрейнта пк и фк с именем ABC будет называться ABC, а не rdb$primary5 или rdb$foreign12.
Поэтому достаточно корректно именовать констрейнты.
У ТС в его примере индексы именуются (как я понял) для того, чтобы знать, по какому столбцу они созданы. А вот отличить ПК и ФК можно только косвенно

CONSTRAINT PK_%s$ID PRIMARY KEY (ID) USING INDEX IDX_%s$ID
ADD CONSTRAINT FK_%0:s$MASTER_ID FOREIGN KEY (MASTER_ID)
REFERENCES %1:s (ID) USING INDEX IDX_%0:s$MASTER_ID ;

Получается, для таблицы А
ПК - IDX_AID
ФК - IDX_AMASTER_ID

p.s. поначалу я добавку "ID" воспринял как "номер индекса" или что-то вроде.
...
Рейтинг: 0 / 0
20.04.2017, 12:44
    #39441522
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
kdvfraksЧто бы потом точно знать как этот индекс называется.
начиная с fb 1.5 абсолютно точно известно, что индекс для констрейнта пк и фк с именем ABC будет называться ABC, а не rdb$primary5 или rdb$foreign12.
Поэтому достаточно корректно именовать констрейнты.


Я это и имел ввиду.
Типа если сделать
Код: plsql
1.
2.
3.
create table t (
id integer not null primary key
)


то сгенерится и имя констрейнта и имя индекса.

А если сделать
Код: plsql
1.
2.
3.
4.
create table t (
id integer not null
);
ALTER TABLE T ADD CONSTRAINT T_PK PRIMARY KEY (ID);


то тут уже все прибито гвоздиками и будет заранее известным.
...
Рейтинг: 0 / 0
20.04.2017, 13:20
    #39441562
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
fraksто сгенерится и имя констрейнта и имя индекса.
именно. Но якобы можно написать и так
create table A(
id int not null primary key using index ...)
в этом случае сгенерится только constraint, а потом его искать в системных таблицах. Нунах.
...
Рейтинг: 0 / 0
21.04.2017, 11:27
    #39442126
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
fraksЧто бы потом точно знать как этот индекс называется.
Ситуация может быть примерно такой.
Есть начальный скрипт создания базы.
Все дальнейшие изменения метаданных идут в виде скриптов-патчей которые последовательно накатываются на базу.
Бывает нужно удалить индекс, или принудительно на него сослаться. Если сервер проименует его на свое усмотрение то в скрипте-патче можно это усмотрение и не угадать. Теоретически если на все экземпляры базы накатывать строго одинаково и в промежутке ничем не лазить - то эти автогенеренные имена должны совпасть. Но жизнь обычно сложнее.

После того как я на этом накололся - создаю все констрейнты, даже PK - отдельной командой ALTER TABLE.

+1

Для разраба, имеющего в саппорте больше одной БД и/или более одной версии ПО, требование на именование ВСЕХ объектов в базе - очевидно.
...
Рейтинг: 0 / 0
21.04.2017, 12:22
    #39442187
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
PEAKTOPтребование на именование ВСЕХ объектов в базе - очевидно.
что-то вас понесло. Вы все USING INDEX пишете?
...
Рейтинг: 0 / 0
21.04.2017, 12:30
    #39442197
PEAKTOP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
firebird batch script
kdvPEAKTOPтребование на именование ВСЕХ объектов в базе - очевидно.
что-то вас понесло. Вы все USING INDEX пишете?
конечно.

и много раз спасало, не только при апдейте структуры базы на новую версию.
когда чинил базы с посыпавшихся винтов, тоже помогало: сразу по имени индекса понятно, где "кривые" записи.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / firebird batch script / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]