Re: DBI: Ü berfluessiges Quoten verhindern

Michael Neumann <[email protected]> Mon, 24 May 2004 21:17:38 +0200
Newsgroups gmane.comp.lang.ruby.german
Message-ID <[email protected]>
On Mon, May 24, 2004 at 09:07:05PM +0200, Detlef Reichl wrote:
> Hallo,
> 
> bei der Nutzung von SQL via DBI kommt es des häufigeren bei mir vor,
> dass auch die Spaltennamen erst zur Laufzeit festgelegt werden.
> Beispiel:
> 
> @handle.do("INSERT INTO ? (Word)
>             VALUES (?)", @lang_source, source)
> 
> Dies geht schief, da @lang_source gequoted wird. Deshalb weiche ich
> momentan auf folgendes Gebilde aus:
> 
> @handle.do("INSERT INTO " + @lang_source + " (Word)
>             VALUES (?)", source)

Mit Interpolation:

  @handle.do("INSERT INTO #{ @lang_source } (Word) VALUES (?)", source)

Oder gar so (aber nicht zu empfehlen):

  @handle.do("INSERT INTO #@lang_source (Word) VALUES (?)", source)

> Gibt es eine Möglichkeit das quoting selectiv zu unterbinden. Waere es
> nicht praktisch, wenn der DBI Treiber dies nicht selbst richtig
> macht :-) ? Habe leider nichts in der Doku gefunden.

Nein, ist glaub nicht machbar, es sei denn man würde einen SQL-Parser
schreiben, der weiss an welcher Stelle ein Spaltenname kommt, oder man
definiert eine Column Klasse und erweitert das quoting entsprechend für
diesen Typ.

DBI überlässt das Binden der Parameter, wenn möglich, der Datenbank
(auch wenn dies in den wenigsten Fällen geschieht).  Normalerweise
können hierbei nur Werte (VALUES) gebunden werden und nicht Spalten-
oder Tabellennamen, da dies wenig Sinn machen würde für ein Prepared
Statement. Schliesslich dient dies ursprünglich dem Performancegewinn
(mehrmaliges Ausführen mit unterschiedlichen Daten).

Parameter (VALUES) sind hier was besonderes, da sie evtl. abhängig von
der Datenbank unterschiedlich gequoted werden. Spaltennamen stellen
glaub kein besonderes Problem dar.

Grüsse,

  Michael