Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ALTER wird im Script für TIBSQL nicht erkannt (https://www.delphipraxis.net/62971-alter-wird-im-script-fuer-tibsql-nicht-erkannt.html)

Jens Schumann 12. Feb 2006 10:02

Datenbank: Firebird • Zugriff über: IBX 6

ALTER wird im Script für TIBSQL nicht erkannt
 
Hallo,
ich habe ein merkwürdiges Problem mit TIBSQL.
In einer Textdatei befindet sich folgendes Script. (Das Script wird von der IBConsole einwandfrei verarbeitet.)
SQL-Code:
CREATE TABLE "INPUT_TEST"
(
  "JAHR"   TINT ,
  "VER"   TINT ,
  "KATEGORIE"   TSTRING30  COLLATE DE_DE,
  "PARTNER"   TSTRING15  COLLATE DE_DE,
  "EMPF"   TSTRING15  COLLATE DE_DE,
  "PLANWERT"   DOUBLE PRECISION,
  "POSNR"   TSTRING30  COLLATE DE_DE,
  "BWA"   TSTRING15  COLLATE DE_DE,
  "SAISON"   TINT
);
ALTER TABLE "INPUT_TEST" ADD FOREIGN KEY ("VER") REFERENCES "VERSIONEN" ("ID") ON UPDATE CASCADE ON DELETE CASCADE;
SET TERM ^ ;


/* Triggers only will work for SQL triggers */

CREATE TRIGGER "TRG_INPUT_TEST _0" FOR "INPUT_TEST"
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.ver is null) then SELECT id FROM versionen WHERE aktive=1 INTO new.ver;
end
 ^
SET TERM ;^
Mit folgendendem Code möchte ich das Script verarbeiten
Delphi-Quellcode:
procedure TFormDatasources.CreateTable(const Tablename: String);
// Über den Pararmeter Tablename soll später der Tabellenname kommen
// Hinter SystemDataprovider.DbDataprovider.Command2 verbirgt sich TIBSQL.
var
  aSQL : TStringList;
begin
  aSQL:=TStringList.Create;
  Try
    aSQL.LoadFromFile(ApplicationPath+'Datenbank\createtable.txt'); // Just for testing
    With DM do
      begin
      SystemDataprovider.DbDataprovider.Transaction2.StartTransaction;
      Try
        SystemDataprovider.DbDataprovider.Command2.SQL:=aSQL;
        SystemDataprovider.DbDataprovider.Command2.ExecQuery;
      Finally
        SystemDataprovider.DbDataprovider.Transaction2.Commit;
        end;
      end;
  Finally
    aSQL.Free;
    end;
end;
Während der Ausführung tritt dann dieser Fehler auf
Code:
Dynamic SQL Error
        SQL error code = -104'
        Token unknown - line 1' +'3, char 1'
        'ALTER'
Hat jemand dafür eine Erklärung das ALTER hier nicht bekannt ist oder evt. sogar eine Lösung?

MrSpock 12. Feb 2006 10:47

Re: ALTER wird im Script für TIBSQL nicht erkannt
 
Hallo Jens,

das liegt daran, dass die IBSQL Komponente keine Scripts verarbeiten kann, sondern nur einzelne SQL Anweisungen. Ich habe deshalb Scripts immer in einzelne SQL Statements zerlegt, die ich dann einzeln ausgeführt habe. Ich meine, dass FibPlus ab der Version 6 Scripts direkt ausführen kann.

Jens Schumann 12. Feb 2006 10:53

Re: ALTER wird im Script für TIBSQL nicht erkannt
 
Hallo Mr Spock,
mittlerweile habe ich die Scripte entsprechend aufgeteilt.
Das Script für die Tabelle sieht jetzt so aus
SQL-Code:
CREATE TABLE "INPUT_TEST"

  "JAHR"   TINT ,
  "VER"   TINT ,
  "KATEGORIE"   TSTRING30  COLLATE DE_DE,
  "PARTNER"   TSTRING15  COLLATE DE_DE,
  "EMPF"   TSTRING15  COLLATE DE_DE,
  "PLANWERT"   DOUBLE PRECISION,
  "POSNR"   TSTRING30  COLLATE DE_DE,
  "BWA"   TSTRING15  COLLATE DE_DE,
  "SAISON"   TINT,
FOREIGN KEY ("VER") REFERENCES "VERSIONEN" ("ID") ON UPDATE CASCADE ON DELETE CASCADE;
);
Grundsätzlich funktioniert das auch. Aber wenn mehr als ein User angemeldet sind kommt jetzt dieser Fehler
Code:
ISC ERROR CODE:335544351

ISC ERROR MESSAGE:
unsuccessful metadata update
object VERSIONEN is in use

MrSpock 12. Feb 2006 11:07

Re: ALTER wird im Script für TIBSQL nicht erkannt
 
Hallo Jens,

ich vermute, dass es damit zusammenhängt, dass du eine Tabelle erstellst mit einem Fremdschlüssel auf die Tabelle Versionen mit cascading update und delete und die Tabelle Versionen zur Zeit in Benutzung ist. Damit wäre es dann nicht möglich, Änderungen in Versionen kaskadierend zu übernehmen. Wie gesagt, das ist nur eine Vermutung aufgrund der Fehlermeldung.

Jens Schumann 12. Feb 2006 11:12

Re: ALTER wird im Script für TIBSQL nicht erkannt
 
Zitat:

Zitat von MrSpock
Hallo Jens,

ich vermute, dass es damit zusammenhängt, dass du eine Tabelle erstellst mit einem Fremdschlüssel auf die Tabelle Versionen mit cascading update und delete und die Tabelle Versionen zur Zeit in Benutzung ist. Damit wäre es dann nicht möglich, Änderungen in Versionen kaskadierend zu übernehmen. Wie gesagt, das ist nur eine Vermutung aufgrund der Fehlermeldung.

Die Vermutung habe ich auch. Aber ich kann keine Erklärung dafür finden. Wenn jetzt User1 die Tabelle erzeugen möchte und User innerhalb einer Transkation irgendetwas mit der Tabelle versionen macht könnte ich mir das vorstellen. User2 macht aber nichts. Users2 ist nur angemeldet und hat noch keinerlei Aktionen gegen die Datenbank abgesetzt.

MrSpock 12. Feb 2006 11:33

Re: ALTER wird im Script für TIBSQL nicht erkannt
 
Hallo Jens,

das ist seltsam. Hast du die zugehörige Transaction, mit der die Tabelle erzeugt wird, einmal auf "write und consistency" (Lesen Schreiben Tabellenstabilität) gesetzt?

Jens Schumann 12. Feb 2006 11:39

Re: ALTER wird im Script für TIBSQL nicht erkannt
 
Zitat:

Zitat von MrSpock
Hallo Jens,

das ist seltsam. Hast du die zugehörige Transaction, mit der die Tabelle erzeugt wird, einmal auf "write und consistency" (Lesen Schreiben Tabellenstabilität) gesetzt?

Habe ich gerade gemacht. Immer noch der geliche Fehler. Es ist auch nur diese eine Transaktion aktive.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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 by Thomas Breitkreuz