2010-05-04 2 views
3

Я использую D2K9, Zeos 7альфа и Firebird 2.1Delphi: как создать Firebird базе данных программно

Я имел эту работу, прежде чем я добавил поле AutoInc. Хотя я не уверен, что делал это на 100% правильно. Я не знаю, что делать с кодом SQL, с триггерами, генераторами и т. Д. Я пробовал несколько комбинаций, я предполагаю, что я делаю что-то неправильно, кроме того, что это не сработает.

Текущий Демонстрационный: http://uploading.com/files/bd64d8m9/createdb.zip/

Текущая ошибка:

It's getting an error here: 

SQL Error: Dynamic SQL Error SQL error code = -104 Token unknown - line 2, column 1 SET. 
Error Code: -104. Invalid token The SQL: 
CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 

SET ГЕНЕРАТОР GEN_EMAIL_ACCOUNTS_ID К 1;

SQL файл из IBExpert:

/******************************************************************************/ 
/*     Generated by IBExpert 5/4/2010 3:59:48 PM     */ 
/******************************************************************************/ 

/******************************************************************************/ 
/*  Following SET SQL DIALECT is just for the Database Comparer   */ 
/******************************************************************************/ 
SET SQL DIALECT 3; 



/******************************************************************************/ 
/*         Tables         */ 
/******************************************************************************/ 


CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 

CREATE TABLE EMAIL_ACCOUNTS (
    ID   INTEGER NOT NULL, 
    FNAME  VARCHAR(35), 
    LNAME  VARCHAR(35), 
    ADDRESS  VARCHAR(100), 
    CITY   VARCHAR(35), 
    STATE  VARCHAR(35), 
    ZIPCODE  VARCHAR(20), 
    BDAY   DATE, 
    PHONE  VARCHAR(20), 
    UNAME  VARCHAR(255), 
    PASS   VARCHAR(20), 
    EMAIL  VARCHAR(255), 
    CREATEDDATE DATE, 
    "ACTIVE"  BOOLEAN DEFAULT 0 NOT NULL /* BOOLEAN = SMALLINT CHECK (value is null or value in (0, 1)) */, 
    BANNED  BOOLEAN DEFAULT 0 NOT NULL /* BOOLEAN = SMALLINT CHECK (value is null or value in (0, 1)) */, 
    "PUBLIC"  BOOLEAN DEFAULT 0 NOT NULL /* BOOLEAN = SMALLINT CHECK (value is null or value in (0, 1)) */, 
    NOTES  BLOB SUB_TYPE 0 SEGMENT SIZE 1024 
); 




/******************************************************************************/ 
/*        Primary Keys        */ 
/******************************************************************************/ 

ALTER TABLE EMAIL_ACCOUNTS ADD PRIMARY KEY (ID); 


/******************************************************************************/ 
/*         Triggers         */ 
/******************************************************************************/ 


SET TERM^; 



/******************************************************************************/ 
/*       Triggers for tables        */ 
/******************************************************************************/ 



/* Trigger: EMAIL_ACCOUNTS_BI */ 
CREATE OR ALTER TRIGGER EMAIL_ACCOUNTS_BI FOR EMAIL_ACCOUNTS 
ACTIVE BEFORE INSERT POSITION 0 
AS 
BEGIN 
    IF (NEW.ID IS NULL) THEN 
    NEW.ID = GEN_ID(GEN_EMAIL_ACCOUNTS_ID,1); 
END 
^ 


SET TERM ;^



/******************************************************************************/ 
/*         Privileges         */ 
/******************************************************************************/ 

Триггеры:

/******************************************************************************/ 
/*  Following SET SQL DIALECT is just for the Database Comparer   */ 
/******************************************************************************/ 
SET SQL DIALECT 3; 

CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 

SET TERM^; 



CREATE OR ALTER TRIGGER EMAIL_ACCOUNTS_BI FOR EMAIL_ACCOUNTS 
ACTIVE BEFORE INSERT POSITION 0 
AS 
BEGIN 
    IF (NEW.ID IS NULL) THEN 
    NEW.ID = GEN_ID(GEN_EMAIL_ACCOUNTS_ID,1); 
END 
^ 


SET TERM ;^

Генераторы:

CREATE SEQUENCE GEN_EMAIL_ACCOUNTS_ID; 
ALTER SEQUENCE GEN_EMAIL_ACCOUNTS_ID RESTART WITH 2; 

/* Old syntax is: 
CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 
SET GENERATOR GEN_EMAIL_ACCOUNTS_ID TO 2; 
*/ 

Мой код: Demo в комментариях ниже.

+3

Если вы предоставляете такую ​​стену текста, это препятствует людям.Не используйте теги 'code' и' pre', вместо этого используйте кнопку панели инструментов форматирования кода в редакторе или просто присвойте свой код четырьмя пробелами. Кроме того, удалите все, что не нужно людям, чтобы понять проблему, например, многие комментарии и пустые строки, которые имеет сценарий IBExpert. – mghie

+0

У меня нет панели инструментов форматирования кода, которая появляется ... но в следующий раз я попытаюсь отформатировать все немного лучше, хотя в моем браузере это проявилось хорошо. – Brad

+0

Здесь не отображается (Firefox в Mac OS X). И вы должны иметь кнопку форматирования, это та, которая имеет небольшие «0» и «1» на панели инструментов над элементом управления редактирования, в котором есть подсказка «Образец кода ...». – mghie

ответ

2

Как правило, вы можете создавать объекты базы данных Firebird в любом порядке при условии, что они не зависят друг от друга. Если они это сделают, то, очевидно, вам нужно создать зависящие объекты до того, как вы создадите зависящие объекты.

Если у вас есть объекты с круговыми ссылками, сначала создайте один из них с пустым телом, создайте другой, затем заполните содержимое первого, используя ALTER TABLE или соответствующий оператор. Инструменты, такие как IBExpert, Database Workbench или FlameRobin, анализируют зависимости, поэтому в соответствии с порядком создания в написанных ими сценариях всегда должны работать.

Если ваш скрипт, созданный IBExpert, работает, но ваш собственный код, выполняющий действия в том же порядке, не работает, то причина этого может заключаться в IBExpert, выполняющем каждый оператор DDL отдельно (пока ваш код не работает). Вы можете сделать то же самое в своем коде, и вам нужно. Ваш столбец autoinc включает триггер, который сам зависит от генератора, поэтому убедитесь, что вы зафиксировали после создания таблицы и генератора, прежде чем создать триггер.

Edit:

Вы должны убедиться, что вы выполняете только несколько операторов с компонентами базы данных, которые в состоянии сделать это. Я не знаю Zeos, но от this knowledge base article кажется, что и TZQuery, и TZUpdateSQL поддерживают несколько операторов в одном вызове. Кроме того, вы можете использовать TZSQLProcessor для загрузки полного скрипта, созданного IBExpert, и выполнить его.

С другой стороны, метод TZConnection.ExecuteDirect() может не поддерживать несколько операторов, и в этом случае вы получите синтаксические ошибки после окончания первого оператора. Это

CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 
SET GENERATOR GEN_EMAIL_ACCOUNTS_ID TO 2; 

два заявления, и вы, возможно, потребуется пройти каждый отдельно TZConnection.ExecuteDirect().

+0

Вы можете показать мне, что вы имеете в виду, делая каждый DDL отдельно? Я думал, что делаю это отдельно. – Brad

+0

@Brad: Вы делаете их отдельно, но вам, возможно, придется также совершить свою работу. Либо вы можете установить опцию Zeos для автоматической фиксации DDL, либо вам необходимо зафиксировать транзакцию явно. У меня нет опыта работы с Zeos, но что-то вроде 'Commit()' или 'CommitRetaining()' должно быть доступно в объекте базы данных или на выделенном объекте транзакции. Для получения дополнительной информации о транзакциях см., Например, статьи на http://firebirdfaq.org. – mghie

+0

autoCommit уже был включен. – Brad

 Смежные вопросы

  • Нет связанных вопросов^_^