Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fremdschlüssel löschen. (https://www.delphipraxis.net/195445-fremdschluessel-loeschen.html)

Walter Landwehr 28. Feb 2018 17:38

Datenbank: Firbird • Version: 2,5,5 • Zugriff über: IBO / IBExpert

Fremdschlüssel löschen.
 
Hallo, ich will in einer Firebird 2.5 Tabelle einen Fremdschlüssel löschen.
Mein SQL sieht so aus.
Delphi-Quellcode:
ALTER TABLE TBL_RECHNUNG DROP CONSTRAINT FK_TBL_RECHNUNG
Aber der Schlüssel wird nicht gelöscht. Dies soll zur Laufzeit geschehen.
Mit IBExpert geht das.

Kann mir da einer helfen.

hoika 28. Feb 2018 18:05

AW: Fremdschlüssel löschen.
 
Hallo,
fehlendes Commit?
Tabellen bei einem anderen User offen?

Fehlermeldung? Exception?

TigerLilly 1. Mär 2018 06:58

AW: Fremdschlüssel löschen.
 
Ich kenne FB nicht so gut, also liege ich vielleicht daneben:
DROP CONSTRAINT vs DROP INDEX? Oft erzeugt das Anlegen eines Constraints den Index automatisch, das Entfernen des Constraints entfernt aber den Index nicht.

hoika 1. Mär 2018 07:32

AW: Fremdschlüssel löschen.
 
Hallo,
FB legt den passenden Index bei Constraints an und löscht ihn auch wieder.

Walter Landwehr 1. Mär 2018 07:59

AW: Fremdschlüssel löschen.
 
Danke an alle, habe es gelöst indem ich den SQL Befehl im Script gepackt habe.

himitsu 1. Mär 2018 08:18

AW: Fremdschlüssel löschen.
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1394900)
Danke an alle, habe es gelöst indem ich den SQL Befehl im Script gepackt habe.

Was war denn nun der Fehler?

Eine Fehlermeldung/Exception oder keine Meldung, aber der Constraint blieb dennoch zurück?


Bei PgDAC hab ich z.B. ein Problem, wenn in der Query-Komponente solche Befehle ausgeführt werden, die kein Result liefern, bzw. SELECT mit Methoden in der Rückgabe, die aber ein Result liefern.
Da wird das Query dann doppelt ausgeführt und es kommt eine Fehlermeldung, wie z.B. "CONSTRAINT FK_TBL_RECHNUNG exisitert nicht" im zweiten Durchlauf, was auch klar ist, da de Erste das schon gemacht hatte.
Der User und das Programm (Exceptionbehandlung) denken dann es ging nicht, aber das stimmt eben nur Halb.

In der Script-Komponente passiert das nicht, da die eh kein Result erwartet.

Delphi.Narium 1. Mär 2018 08:45

AW: Fremdschlüssel löschen.
 
Mein Vorgehen ist eigentlich grob immer so in der Art:
Delphi-Quellcode:
// qry ist irgendeine Komponente zur Ausführung von SQLs.
qry.Close;
qry.SQL.Text := 'Eine Zeichenfolge, die irgendwo herkommt';
if AnsiLowerCase(copy(qry.SQL.Text,1,6)) = 'select' then begin
  qry.Open;
end else begin
  qry.ExecSQL;
end;
Natürlich gibt es immer 'ne Fehlerbehandlung, geht hier halt nur ums sinnmäße Prinzip. Dabei ist es dann egal, ob TADOQuery, TQuery, 'ner Query der Zeos-Komponenten oder was weiß der Geier sonst noch.

Open und dann kein Select da drin, das ist immer eher "ungünstig" und ohne sinnvolle Fehlerbehandlung kaum zu managen. Je nach DB ist dann auch noch die Art der Fehlermeldung unterschiedlich und kaum einheitlich händelbar.

jobo 1. Mär 2018 09:33

AW: Fremdschlüssel löschen.
 
Zitat:

Zitat von himitsu (Beitrag 1394903)
..
Was war denn nun der Fehler?
..
Bei PgDAC hab ich z.B. ein Problem, wenn in der Query-Komponente solche Befehle ausgeführt werden, die kein Result liefern, bzw. SELECT mit Methoden in der Rückgabe, die aber ein Result liefern.
Da wird das Query dann doppelt ausgeführt und es kommt eine Fehlermeldung, wie z.B. "CONSTRAINT FK_TBL_RECHNUNG exisitert nicht" im zweiten Durchlauf, was auch klar ist, da de Erste das schon gemacht hatte.

Und was ist da der Fehler? Versteh ich das richtig, dass Du innerhalb eines Select mit mglw > 1 Rückgabezeilen eine Funktion ausführst. Die Operation wird dann so oft wiederholt, wie sie aufgerufen wird, also pro Rückgabezeile einmal?

Oder sprichst Du von etwas anderem (was ich dann nicht verstanden habe)?

mkinzler 1. Mär 2018 09:37

AW: Fremdschlüssel löschen.
 
Ich Vermute Mal es wird versucht eine Rückgabe auszuwerten, welche wegen .ExecSQL ausbleibt und die Aktion deshalb wiederholt wird.

himitsu 1. Mär 2018 10:28

AW: Fremdschlüssel löschen.
 
Innerhalb von StoredProcs (Postgres) kann man
Delphi-Quellcode:
PERFORM FunktionDieEtwasMachtAberKeinResultHat();
machen,
aber in Query/Script-Kompnenten geht nur
Delphi-Quellcode:
SELECT FunktionDieEtwasMachtAberKeinResultHat();
und schon bringt der Code von Delphi.Narium leider nichts, bzw. funktioniert zur Hälfte nicht. :zwinker:

PS: Recursive SELECTS werden von dir auch nicht beachtet, also wenn das SELECT nicht direkt am Anfang steht,
oder noch ein Kommentar davor oder ....

Und nein, "Result mit 0 Rows" und "kein Result" sind nicht das Selbe. :angle:
Bei Ersterem gibt es X Fields/Columns und beim Anderen 0 Field-Infos.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:28 Uhr.
Seite 1 von 2  1 2      

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