es gibt durchaus Kunden, die so was erfolgreich machen und in Ihrer Exe jeden Versionstand der
db
einfach mit verteilen.
Ich mach das nicht, weil bei mir eine exe auch unterschiedliche Datenbankstände
bedienen kann, aber bei wem das Projekt immer eine 1zu1 Beziehung zwischen Datenbank und exe hat, der
kann in seiner exe ja einfach alle
db sql definitionen durchnummerieren und in der
db dann einfach
speichern, welcher Befehlsummer in dieser
db zuletzt ausgeführt wurde und wenn eine neue exe kommt,
dann alle
sql befehle auf dieser
db ausführt, die noch erforderlich sind, um den neuesten Datenbankstand
zu erzeugen.
Wenn du sehen willst, welche Befehle gebraucht werden, um eine komplette firebird datenbank anzulegen, lade
dir zum Beispiel ibexpert auch als personal herunter und schau da in die db1_30.sql datei an, die dort für die
demo
db mit kopiert wird ( da ist fast alles drin, was man in fb30 machen kann).
Deine Aufgabe wäre dann nur noch, das Script in Teile aufzuteilen, die deine Komponenten dann step by step
ausführen können und die dann entsprechend der o.a. Liste in deine exe aufzunehmen und die jeweils ausgeführte
dann als datenbankstand in der
db zu speichern, damit beim nächsten Start der exe das nicht noch mal passiert.
Ob du die
sql Befehle dann jeweils einfach als String konstanten mit passender benennung reinkompilierst
oder einfach als externe Textdatei zur exe auslieferst bleibt dir überlassen (es kann aber durchaus
komplexer werden als du auf den ersten blick denkst, weil wenn du ein objekt änder willst, das
von anderen benutzt wird, musst du ggf erst mal alle abhängigen objekte ändern oder sogar löschen
und ggf programmierst du dann deinen eigenen ibexpert nach, der so was sowieso schon kann.
auf der seite ddl siehst du in ibexpert auch alle befehle, die erforderlich sind, um das jeweilige
Datenbankobjekt zu erzeugen, das sieht dann zB so aus
Code:
/******************************************************************************/
/**** Generated by IBExpert 16.04.2021 08:46:47 ****/
/******************************************************************************/
/******************************************************************************/
/**** Following SET
SQL DIALECT is just for the Database Comparer ****/
/******************************************************************************/
SET
SQL DIALECT 3;
/******************************************************************************/
/**** Tables ****/
/******************************************************************************/
CREATE GENERATOR ID;
CREATE TABLE ORDERS (
ID NUMERIC(18,0) NOT NULL,
ORDERDATE DATE NOT NULL,
CUSTOMER_ID NUMERIC(18,0),
NETAMOUNT NUMERIC(12,2) NOT NULL,
TAX NUMERIC(12,2) NOT NULL,
TOTALAMOUNT NUMERIC(12,2) NOT NULL
);
/******************************************************************************/
/**** Primary keys ****/
/******************************************************************************/
ALTER TABLE ORDERS ADD CONSTRAINT PK_ORDERS PRIMARY KEY (ID);
/******************************************************************************/
/**** Foreign keys ****/
/******************************************************************************/
ALTER TABLE ORDERS ADD CONSTRAINT FK_CUSTOMERID_1 FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER (ID) ON DELETE CASCADE;
/******************************************************************************/
/**** Indices ****/
/******************************************************************************/
CREATE DESCENDING INDEX ORDERS_IDX1 ON ORDERS (ORDERDATE);
/******************************************************************************/
/**** Triggers ****/
/******************************************************************************/
SET TERM ^ ;
/******************************************************************************/
/**** Triggers for tables ****/
/******************************************************************************/
/* Trigger: ORDERS_BI0 */
CREATE OR ALTER TRIGGER ORDERS_BI0 FOR ORDERS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if (new.id is null) then
new.id = gen_id(id, 1);
END
^
SET TERM ; ^
/******************************************************************************/
/**** Privileges ****/
/******************************************************************************/