3

D2K9、Zeos 7Alpha、および Firebird 2.1 を使用しています

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;

GENERATOR GEN_EMAIL_ACCOUNTS_ID を 1 に設定します。

IBExpert からの SQL ファイル:

/******************************************************************************/
/*                 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;
*/

私のコード: 以下のコメントのデモ。

4

1 に答える 1

2

一般に、互いに依存していなければ、Firebird データベース オブジェクトを任意の順序で作成できます。その場合、依存オブジェクトを作成する前に、依存オブジェクトを作成する必要があります。

循環参照を持つオブジェクトがある場合は、まずボディが空のオブジェクトを 1 つ作成し、もう 1 つを作成してから、ALTER TABLEまたは対応するステートメントを使用して最初のオブジェクトの内容を入力します。IBExpert、Database Workbench、FlameRobin などのツールは依存関係を分析するため、それらによって記述されたスクリプトの作成順序に従うことは常に機能するはずです。

IBExpert が作成したスクリプトは機能するが、同じ順序で処理を行う独自のコードが機能しない場合、その原因は IBExpert が各DDLステートメントを個別にコミットすることにある可能性があります (コードは機能しません)。コードで同じことを行うことができます。autoinc 列には、それ自体がジェネレーターに依存するトリガーが含まれているため、トリガーを作成する前に、テーブルとジェネレーターが作成された後にコミットするようにしてください。

編集:

複数のステートメントを実行できるデータベース コンポーネントでのみ実行するようにしてください。Zeos についてはわかりませんが、このナレッジ ベースの記事から、 と の両方が 1 回の実行呼び出しで複数のステートメントをサポートTZQueryしているようです。または、IBExpert によって作成された完全なスクリプトをロードして実行するためTZUpdateSQLに使用できるはずです。TZSQLProcessor

一方、メソッドTZConnection.ExecuteDirect()は複数のステートメントをサポートしていない場合があり、その場合、最初のステートメントの終了後に構文エラーが発生します。これ

CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID;
SET GENERATOR GEN_EMAIL_ACCOUNTS_ID TO 2;

は 2 つのステートメントであり、それぞれを に個別に渡す必要がある場合がありますTZConnection.ExecuteDirect()

于 2010-05-05T04:18:01.580 に答える