powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / firebird batch script
28 сообщений из 28, показаны все 2 страниц
firebird batch script
    #39440528
зеленый админ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет. Попробовал прогнать скрипт:
Код: 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
firebird batch script
    #39440575
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зеленый админ,

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

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

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

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

Ты бы по-русски написал чего ты таки хочешь в итоге?
...
Рейтинг: 0 / 0
firebird batch script
    #39440655
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Антон КарасёвЕму явно не нравится имя индекса "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
firebird batch script
    #39440656
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

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

Код: 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
firebird batch script
    #39440665
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зеленый админ,

а зачем после каждого оператора точка с запятой стоит если он всё равно в ES выполняется?
...
Рейтинг: 0 / 0
firebird batch script
    #39440812
зеленый админ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри опять же. Не выложил код зависимых процедур.
Код: 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
firebird batch script
    #39440817
Фотография PEAKTOP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зеленый админпрогнал код (выше + 1-ый пост) на новой БД - все работает. На старой - виснет коммит. Проверю потом еще провисшие транзакции. Отпишусь вечером.

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

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

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

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

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

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

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

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

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

После того как я на этом накололся - создаю все констрейнты, даже PK - отдельной командой ALTER TABLE.
...
Рейтинг: 0 / 0
firebird batch script
    #39441434
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
firebird batch script
    #39441522
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
firebird batch script
    #39441562
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksто сгенерится и имя констрейнта и имя индекса.
именно. Но якобы можно написать и так
create table A(
id int not null primary key using index ...)
в этом случае сгенерится только constraint, а потом его искать в системных таблицах. Нунах.
...
Рейтинг: 0 / 0
firebird batch script
    #39442126
Фотография PEAKTOP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksЧто бы потом точно знать как этот индекс называется.
Ситуация может быть примерно такой.
Есть начальный скрипт создания базы.
Все дальнейшие изменения метаданных идут в виде скриптов-патчей которые последовательно накатываются на базу.
Бывает нужно удалить индекс, или принудительно на него сослаться. Если сервер проименует его на свое усмотрение то в скрипте-патче можно это усмотрение и не угадать. Теоретически если на все экземпляры базы накатывать строго одинаково и в промежутке ничем не лазить - то эти автогенеренные имена должны совпасть. Но жизнь обычно сложнее.

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

+1

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

и много раз спасало, не только при апдейте структуры базы на новую версию.
когда чинил базы с посыпавшихся винтов, тоже помогало: сразу по имени индекса понятно, где "кривые" записи.
...
Рейтинг: 0 / 0
firebird batch script
    #39442230
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, нет, не все. Я задаю одинаковые имена для индексов и ограничений через CONSTRAINT'ы после описания столбцов.
...
Рейтинг: 0 / 0
firebird batch script
    #39442675
зеленый админ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PEAKTOPkdvчто-то вас понесло. Вы все USING INDEX пишете?
конечно.
и много раз спасало, не только при апдейте структуры базы на новую версию.

А от себя добавлю: попадете на особенно крупный проект, то вас там никто особенно спрашивать не будет, именование объектов будет входить в policy вплоть до суффиксов и префиксов. У меня лично это привычка после Оракла, где, действительно, многие генерируемые имена были случайны.
...
Рейтинг: 0 / 0
firebird batch script
    #39443002
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvPEAKTOPтребование на именование ВСЕХ объектов в базе - очевидно.
что-то вас понесло. Вы все USING INDEX пишете?

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

BDOK_PK - таблица BDOK, первичный ключ
BDOK_FK_NSKLAD - таблица BDOK, foreign_key по полю NSKLAD
BDOK_UNI_ID - таблица BDOK, ограничение уникальности по полю ID (ибо оно там не является первичным ключом)
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / firebird batch script
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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