Hallo,
zuerst einmal Danke für Eure Antworten.
Zitat von
alzaimar:
Wieso schickst Du das Skript nicht einfach zum Server und überlässt dem die Arbeit?
Welche zusätzlichen Befehle / Features möchtest Du einbauen?
Alle Datenbankänderungen werden bei uns per Skript geliefert.
Diese werden analysiert und um weitere Anweisungen ergänzt.
(grants, stored procedure Aufrufe, ...)
Außerdem sollen bestimmte "Langläufer" erkannt werden. (z.B. Updates auf bestimmte Tabellen)
Diese bearbeiteten Skripte werden auf einer speziellen Test Datenbank ausgeführt und wenn keine Fehler aufgetreten sind auf der Produktionsdatenbank.
Wir haben viele Datenbanken, einige davon im mehrstelligen TerraByte Bereich mit sehr sensiblen Daten, da kann man nicht eben mal ein Skript auf der Produktion laufen lassen.
Das Tool soll ein Bestehendes ablösen und den DBAs etwas Arbeit abnehmen.
Ich habe mittlerweile ein kommerzielles Produkt entdeckt, dass auf lexx/yacc basiert.
GSP - general
sql parser (
http://www.sqlparser.com/howto.php )
(Die
VCL Version besteht aus einer Hand voll *.dcu Dateien, es muss also keine
dll mitgeliefert werden.)
Es macht eigentlich einen guten Eindruck. Ich war nur über das Beispielprogramm in der Trail entsetzt und hoffe, das der eigentliche Code nicht so katastrophal programmiert ist.
Kleines Beispielprogramm -> nicht kompilierfähig, >250 Compilerwarnungen, nicht gerade übersichtlich programmiert.
Aber mit einem eigenen kleinen Beispielprogramm bin ich sehr schnell zum Ziel gekommen.
Delphi-Quellcode:
...
var
SqlParser: TGsqlparser;
i: Integer;
j: Integer;
s:
string;
begin
// Parser mit Create erzeugen, Sprache (=Oracle) zuweisen.
SqlParser := TgSqlParser.Create(DbvOracle);
// SQL (PL/SQL) Text zuweisen
SqlParser.SqlText.Assign(Memo1.Lines);
if SqlParser.Parse = 0
then
begin
...
for i := 0
to SqlParser.SqlStatements.Count - 1
do
begin
....
// in SqlParser.SqlStatements[i].SqlStatementType steht der Typ z.B. update, create view, ...
// verwendete Tabellen in dem Statement:
for j := 0
to SqlParser.SqlStatements[i].Tables.Count - 1
do
...
// neu formatiertes SQL (Die Formatierung lässt sich über diverse properties beeinflussen.)
s := SqlParser.SqlStatements[i].PrettySql;
// unverändertes SQL
s := SqlParser.SqlStatements[i].GetTextFromParseTree
// Auf die einzelnen Bestandteile der eigentlichen SQL Statements,
// kann man natürlich mit bestimmten Properties analog zu oben auch zugreifen.
// Es gibt auch die Möglichkeit auf den Lexxer und Syntaxbaum direkt zuzugreifen.
// Damit ist dann alles möglich...
...
end;
...
end;
...
end;
...
Eine site Lizenz kostet nur 220 USD. Für das Geld bekomme ich es nicht selbst programmiert.
Wir haben es bestellt. Ich werde mal was zu meinen Erfahrungen schreiben, wenn ich das Projekt realisiert habe.