Einzelnen Beitrag anzeigen

Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
533 Beiträge
 
FreePascal / Lazarus
 
#8

AW: AutoIncrement mit FireBird

  Alt 16. Apr 2021, 08:56
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                             ****/
/******************************************************************************/
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat