Hallo
DP-Datenbänker,
wahrscheinlich spreche ich hiermit
Joachim Dürr am besten direkt an, da er mir bei meinem Problem wohl am ehesten helfen kann. Was nicht heißen soll, daß niemand anders hierauf antworten darf...
Anforderung:
Ich soll eine vorhandene Datenbankanwendung, mit Delphi 5 Pro geschrieben, die auf einen älteren Advantage Datenbankserver der Version 6.11 aufsetzt, so umschreiben, daß zumindest eine wichtige Tabelle verschlüsselt ist. (Tabelle ist eine dBase-Tabelle mit cdx-Index)
Vorgehensweise:
Die entsprechende Tabelle habe ich mit Advantage Data Architect (V6.11.0.6) verschlüsselt. Nun heißt es bei Advantage, sofern ich das richtig verstanden habe, daß es ausreicht, wenn ich im Ereignis "AfterOpen" der Tabelle "
Table.AdsEnableEncryption( 'passwort' )" ausführen lasse. Klappt im Prinzip auch.
Nur:
Die Anwendung ist in meinen Augen nicht so glücklich aufgebaut, was die Tabelleneinbindung angeht. Es besteht kein zentrales Datenmodul, worauf zugegriffen wird, es gibt auf vielen Formularen TTables, die auf die physikalisch selbe Tabelle zugreifen. Was zur Folge hat, daß die Tabelle je nach Formular, über ein anderes TTable geöffnet wird. Nun bekomme ich den Fehler "
5098: The table is already encrypted.". Selbst, wenn ich nicht das TTable des aktuellen Formulars nutze, sondern Datasource auf z.B. das TTable der gleichen Tabelle auf dem MainForm einstelle.
Muß ich die Anwendung nun erstmal komplett auf ein zentrales Datenmodul umstellen? Obwohl das ja auch nicht zu helfen scheint, da das Umstellen der Datasource ja auch nichts gebracht hat.
Oder hat die Vorgehensweise des ursprünglichen Entwicklers auch Vorteile? Also, ein und dieselbe Tabelle auf mehreren Formularen über TTable einzubinden und darüber explizit anzusprechen...?!
Zitat:
Ein Auszug aus der Knowledge Base:
"This is not a bug but expected behavior. The 6.1 and newer client now correctly throws the 5098 error.
To fix any problems the 5098 error may cause, either trap the error or call AdsIsTableEncrypted before calling AdsEncryptTable."
Schön und gut, aber selbst ein try/except oder das vorherige Abfragen auf Verschlüsselung läßt mich in den selben Fehler laufen...
Gleicher Fehler bei Abfragen:
Den gleichen Fehler erhalte ich allerdings andauernd, wenn ich die verschlüsselte Tabelle in eine Abfrage eingebunden habe. Auch wenn ich ähnlich wie bei TTable im AdsQuery.AfterOpen "
Table.AdsEnableEncryption( 'passwort' )" ausführen lasse...
Auf die Tabelle konnte ich ja schon das ein oder andere Mal zugreifen, bei Abfragen habe ich es noch nicht einmal geschafft, daß sie ausgeführt wird...
Zitat:
Eine Information aus der Knowledge Base:
"For tables that are not associated with a Data Dictionary (free tables), encrypted tables must be opened with adCmdTableDirect. To use encrypted tables with SQL (adCmdText), add the tables to a Data Dictionary and use a Database Connection."
...die ich aber nicht so wirklich umsetzen kann...
Anmerkung:
Leider steht ein Update auf einen neueren Server (V9 steht ja als Beta schon vor der Tür) momentan nicht zur Debatte und ist somit keine Option. Für den Fall, daß es da einfacher funktionieren würde...
Meine Fragen:
Ich weiß, pro Thread nur eine Frage, aber es geht ja um "nur" ein Problem...- Hat jemand Erfahrungen mit dem Verschlüsseln von ADS-Tabellen in V6.11
- Wie kann ich eine verschlüsselte Tabelle in eine Abfrage einbinden?
- Mit den Begriffen adCmdTableDirect und adCmdText kann ich nichts anfangen:
Wo soll ich die anwenden?
- Würde es helfen, ein zentrales Datenmodul zu verwenden?
- Würde es helfen, ein Data Dictionary anzulegen (hab noch nie damit gearbeitet...)?
Quellcode/Beispiel:
Es gibt da nicht wirklich viel zu coden.
Zum einen laut Advantage das hier:
Delphi-Quellcode:
procedure TForm2.KundenTableAfterOpen(DataSet: TDataSet);
begin
KundenTable.AdsEnableEncryption( 'passwort' );
end;
Zum anderen mit vorheriger Abfrage auf Verschlüsselung:
Delphi-Quellcode:
procedure TForm2.KundenTableAfterOpen(DataSet: TDataSet);
begin
if not KundenTable.AdsIsTableEncrypted then
KundenTable.AdsEnableEncryption( 'passwort' );
end;
Ich hoffe daß ich mein Problem einigermaßen verständlich geschildert habe und baue auf einen Denkanstoß von Eurer Seite. Bin mir halt nicht sicher, ob ich nun die Anwendung in Bezug auf die Datenverwaltung gänzlich umstellen muß (DatenModul/Data Dictionary) oder es doch einen einfacheren Weg gibt, um ans Ziel zu kommen.