2010-05-04 3 views
3

내가이 자동 증가 (Autoinc) 필드를 추가하기 전에이 작업을했다 D2K9, ZEOS 7Alpha, 그리고 파이어 버드 2.1델파이 : 프로그래밍

을 사용하고 파이어 버드 데이터베이스를 생성하는 방법에 대해 설명합니다. 내가 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; 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; 
*/ 

내 코드 : 아래의 의견에 데모.

+3

당신이 그런 성의 벽을 제공하면 사람들을 낙담 케합니다.'code'와'pre' 태그를 사용하지 말고 편집기에서 코드 서식 도구 모음 단추를 사용하거나 코드를 4 칸 들여 쓰기 만하면됩니다. 또한 IBExpert 스크립트에있는 많은 주석과 빈 줄과 같이 사람들이 문제를 이해하는 데 필요하지 않은 모든 것을 제거하십시오. – mghie

+0

코드 서식 도구 모음이 표시되지 않습니다. 그러나 브라우저에서 문제가 없지만 다음 번에 모든 것을 좀 더 형식화하려고 노력할 것입니다. – Brad

+0

여기에 제대로 표시되지 않았습니다 (Mac OS X의 Firefox). 그리고 포맷 컨트롤 버튼 위에 작은 "0"과 "1"이있는 포맷팅 버튼이 있어야합니다.이 코드는 힌트 "코드 샘플 ..."을 가지고 있습니다. – mghie

답변

2

일반적으로 Firebird 데이터베이스 객체는 서로 종속되지 않는다면 임의의 순서로 만들 수 있습니다. 그렇다면 의존 객체를 만들기 전에 종속 객체를 만들어야합니다.

순환 참조가있는 개체가있는 경우 먼저 빈 몸체로 개체 중 하나를 만들고 다른 개체를 만든 다음 ALTER TABLE 또는 해당 문을 사용하여 첫 번째 개체의 내용을 채 웁니다. IBExpert, Database Workbench 또는 FlameRobin과 같은 도구는 종속성을 분석하므로 작성된 스크립트의 작성 순서는 항상 작동해야합니다.

IBExpert가 스크립트를 만들었지 만 동일한 순서로 일을하는 코드가 작동하지 않으면 그 원인은 IBExpert에 각 DDL 문을 별도로 커밋하는 것일 수 있습니다 (코드가없는 경우). 코드에서 동일한 작업을 수행 할 수 있으며 그렇게해야합니다. autoinc 열은 자체적으로 생성기에 의존하는 트리거를 포함하므로 트리거를 만들기 전에 테이블 및 생성기가 만들어진 후에 커밋해야합니다.

편집 :

당신은 당신은 단지 그렇게 할 수있는 데이터베이스 구성 요소와 여러 개의 문을 실행할 수 있는지 확인해야합니다. 저는 Zeos에 대해서는 모르지만, this knowledge base article에서 TZQueryTZUpdateSQL은 하나의 실행 호출에서 여러 명령문을 지원하는 것으로 보입니다. 또는 TZSQLProcessor을 사용하여 IBExpert에서 작성한 전체 스크립트를로드하고 실행할 수 있습니다.

반면에 TZConnection.ExecuteDirect() 메서드는 여러 명령문을 지원하지 않을 수 있으며이 경우 첫 번째 명령문이 끝난 후에 구문 오류가 발생합니다. 이

CREATE GENERATOR GEN_EMAIL_ACCOUNTS_ID; 
SET GENERATOR GEN_EMAIL_ACCOUNTS_ID TO 2; 

은 두 문장이므로 각각을 TZConnection.ExecuteDirect()으로 각각 전달해야 할 수 있습니다.

+0

각 DDL을 별도로 수행하면 무슨 뜻인지 보여 줄 수 있습니까? 나는 내가 그들을 따로하고 있다고 생각했다. – Brad

+0

@ 브래드 : 당신은 그것들을 별도로 처리하지만, 당신도 당신의 작업을 커밋해야 할 수도 있습니다. 어느 Zeos 옵션을 DDL을 자동 커밋하도록 설정하거나 트랜잭션을 명시 적으로 커밋해야합니다. 저는 Zeos에 대한 경험이 없지만 데이터베이스 객체 나 전용 트랜잭션 객체에서'Commit()'이나'CommitRetaining()'과 같은 것을 사용할 수 있어야합니다. 거래에 대한 자세한 내용은 http://firebirdfaq.org의 기사를 참조하십시오. – mghie

+0

autoCommit이 이미 켜져 있습니다. – Brad