Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Update Script (https://www.delphipraxis.net/73400-sql-update-script.html)

b01 17. Jul 2006 17:17

Datenbank: Firebird, Interbase • Version: 1.5 • Zugriff über: SQL, Query, Zeos

SQL Update Script
 
Hallo
ich will eine Datenbank (Firebird 1.5)aus meinem Programm heraus updaten. Hierfür benutze ich SQL Scripts in denen ich die Tabellendefinitionen verändere oder neue Tabellen erstelle. Wenn ich das Updatescript in IBExpert teste funtkioniert alles wie es soll, nur wenn ich es aus Delphi heraus versuche funktionierts nicht. Wenn ich die TJvUIBScript Komponente benutze kommt folgende Fehlermeldung
Zitat:

... Exception der Klasse EUIBError aufgetreten. Meldung:'unsuccsessful metadata update STORE RDB$RELATION_FIELDS failed attempt to store dublicate value (visible to active transactions) in unique index "RDB$INDEX_15" This operation is not defined for system tables. Error Code 31', Prozess wurde angehalten ...
Danach habe ich es mit TZSQLProcessor versucht. Das Ergebnis war folgende Meldung:
Zitat:

... Exception der Klasse EZSQLException aufgetretem. Meldung:'unsuccsessful metadata update STORE RDB$RELATION_FIELDS failed attempt to store dublicate value (visible to active transactions) in unique index "RDB$INDEX_15" This operation is not defined for system tables. ...
Zusätzlich wurde die Scriptzeile
SQL-Code:
alter table ARTMODE add def_LOESCHEN BOOLEAN;
zitiert, welche die erste Zeile in dem Script ist. Das Updatescript ist ca 1000 Zeilen lang und enthält verschiedene Kommentare. Da das Script in IBExpert fehlerlos durchläuft gehe ich davon aus das ich die verwendeten Komponenten falsch anspreche, allerdings kann ich in meinen Testprogs keine Fehler finden, zB mit Zeos Komponenten ist der einzige selbsterstelle code
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ZSQLProcessor1.LoadFromFile('D:\Daten\Delphi\Test\update.txt');
  ZSQLProcessor1.Execute;
end;
Bei den Jedi Komponenten sieht es ähnlich aus. Sollte ich das Script in kleinere Packete aufteilen? Wo könnte sonst der Fehler liegen? Gibts es Beispielcode zum verwenden dieser Komponenten?

mkinzler 17. Jul 2006 17:31

Re: SQL Update Script
 
Schau mal auf was der genannte Index weist.

b01 17. Jul 2006 18:27

Re: SQL Update Script
 
Zitat:

Schau mal auf was der genannte Index weist.
Wie genau mach ich das? Ich hab ein paar indices gefunden die mit RDB$ anfangen aber das wars schon. Da ich bisher nicht mit Fehlermeldungen dieser Art konfrontiert worden bin kenn ich mich mit den Firebird innereien noch nicht aus.

mkinzler 17. Jul 2006 18:36

Re: SQL Update Script
 
Alle DB-Objekte die mir RDB$ beginnen sibd Systemobjekte. Blende mal im IBExpert die Systemobjekte ein und schau mal was hinter diesem Index steckt.
Wieviel Benutzer waren/sind zur Ausführungszeit angemeldet?
Vielliecht hilft es schon die datenbank herunterzufahren und neu zu Starten.

b01 18. Jul 2006 18:30

Re: SQL Update Script
 
Danke für den Tipp. Ich denke ich habe den Fehler jetzt eingekreist (für Zeos).
SQL-Code:
create table TB1 (
  A_ID integer not null,
  A_Wert1 float,
  ...
  primary key (A_ID)
);

insert into TB1 (A_ID, A_Wert1) values (1, 0.25);
Das erzeugen der Tabelle wird noch gemacht, beim einfügen der Werte krachts dann. Es ist dabei egal ob die TZConnection Komponente auf autocommit steht oder ich selbst committe (in diesem Fall habe ich das commit erst nach beiden befehlen abgesetzt). Wie lässt sich also obiger Code mit einer TZSQLProcessor Komponente ausführen?

mkinzler 18. Jul 2006 18:37

Re: SQL Update Script
 
Zitat:

der ich selbst committe (in diesem Fall habe ich das commit erst nach beiden befehlen abgesetzt).
In diesem Fall sollte der Commit vor dem INSERT geschehen.
Versuch mal die DDL- und DML-Statements zu trennen und gesonder auszuführen.

b01 18. Jul 2006 18:58

Re: SQL Update Script
 
Wenn ich nach jedem SQL-Befehl committe funktioniert es. Allerdings möchte ich die Änderungen so einteilen das von einer Befehlsgruppe entweder alle oder kein Befehl ausgefürt wird (daher das commit nach mehreren Befehlen). Gibt es trotzdem eine Möglichkeit so etwas zu erreichen?

mkinzler 18. Jul 2006 19:05

Re: SQL Update Script
 
Bevor der Insert funktioniert, muß ein Commit erfolgen. Ich würde die Create-Statement ( DDL) strikt von den INSERT-Statements ( DML) trennen.

Hansa 19. Jul 2006 01:26

Re: SQL Update Script
 
Es gibt einen Befehl
SQL-Code:
COMMIT WORK
Allerdings noch die obligatorische Frage : wozu das Ganze ? Warum immer die DB verändern während das Programm schon läuft ? Was wäre, wenn die Benutzer die DB updaten, das Programm allerdings nicht oder umgekehrt ? Warum wird so etwas nicht von vorneherein synchronisiert ? Für Eventualitäten schreibe ich doch kein Programm, das ich in die Tonne trete. 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz