MySQL 5 - Trigger Query aus String lesen und ausführen - geht das?

MySQL 5 - Trigger Query aus String lesen und ausführen - geht das?

am 16.03.2006 12:54:17 von Christian Maier

Hallo!

Ich möchte ein Datenmodell verwenden, dass ganz einfach customized
werden kann. Ich habe also eine In-Schnittstelle und ein Insert löst
einen Trigger aus der dann das restliche Datenmodell befüllt. Soweit
so gut, nun möchte ich das Datenmodell so offen wie möglich halten,
so sollen auch eigene Custom-Tables möglich sein. Damit der Trigger
nun auch die neuen Tabellen befüllt muss dieser logischerweise
angepasst werden. Das ganze soll jetzt aber modular sein und ich habe
mir gedacht ich speichere zu jedem neuen Table die entsprechende Insert
Queryin einer "Tabellen-Beschreibungs-Tabelle". Wenn der Trigger jetzt
ausgelöst wird, geht er aus dieser Berschreibungstabelle alle Queries
lesen und führt diese nach der Reihe aus.

Das Problem ist jetzt also, dass ein String in eine Query "verwandelt"
werden muss. In DB2 geht sowas mit exec ' ... ' der String wird direkt
dem SQL-Compiler so wie er ist übergeben. DB2 ist für meine Anwendung
dann doch etwas übermotorisiert, gibt es sowas auch in MySQL? Habe in
der Man Page nichts gefunden.=20

Danke!!

SG
Christian Maier

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 16.03.2006 13:07:38 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: MySQL 5 - Trigger Query aus String lesen und ausführen - geht das?

am 16.03.2006 17:38:59 von Christian Maier

Andreas Kretschmer schrieb:

> PREPARE ...
> und dann EXECUTE. Sollte wohl Mysql können, zumindest finde ich da
> Hinweise via Google.
> (http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-state ment-syntax-a=
nd.html)

Danke für den Link fast hätte es geklappt (mit prepare hab ich's auch
im handbuch gefunden) aber dann:
SQL syntax for prepared statements cannot be used within stored
routines (procedures or functions), or triggers. This restriction is
lifted as of MySQL 5.0.13 for stored procedures, but not for stored
functions or triggers.

leider nicht in triggers möglich. vielleicht mach ich's wirklich in
postgres obwohl mit aus performance gründen die mysql besser gefallen
hätte ...

Danke!!
SG
Christian

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 16.03.2006 17:53:06 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: MySQL 5 - Trigger Query aus String lesen und ausführen - geht das?

am 16.03.2006 18:13:47 von Hartmut Holzgraefe

Andreas Kretschmer wrote:
> Das MySQL schneller sei als PG ist wohl ein Gerücht, was nie ausstirb=
t.

genauso wie das Gerücht das es keine Transaktionen unterstützt ...? ;=
)

--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

http://www.mysql.com/support/

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 16.03.2006 18:21:19 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 19.03.2006 13:41:53 von ads-news

Hartmut Holzgraefe wrote:
> Andreas Kretschmer wrote:
>> Das MySQL schneller sei als PG ist wohl ein Gerücht, was nie ausstirbt.
>
> genauso wie das Gerücht das es keine Transaktionen unterstützt ...? ;)

Natürlich ist es kein Gerücht, das Mysql Transaktionen unterstützt.

Nur die Art und Weise ... na ja. Wie der andere Andreas hier schon schrieb,
keine Transaktionen auf DDL Ebene. Halbvollständige Daten, wenn Tabellen,
die nicht transaktionsfähig sind, zusammen mit transaktionsfähigen
Tabellen genutzt werden ect. Das ist (wieder mal) nichts halbes und nichts
ganzes, aber sich hinstellen und behaupten, Transaktionen werden
unterstützt. Toll[tm]


Bye

--
Andreas 'ads' Scherbaum
Explaining the concept of referential integrity to a mysql user is
like explaining condoms to a catholic

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 21.03.2006 12:13:42 von Axel Schwenke

Andreas 'ads' Scherbaum wrote:
>
> Natürlich ist es kein Gerücht, das Mysql Transaktionen unterstützt.
>
> Nur die Art und Weise ... na ja. Wie der andere Andreas hier schon schrieb,
> keine Transaktionen auf DDL Ebene.

Ja, das ist ein nettes Feature. Aber in der Praxis bei weitem nicht
so wichtig wie Transaktionen für die Daten selber.

> Halbvollständige Daten, wenn Tabellen,
> die nicht transaktionsfähig sind, zusammen mit transaktionsfähigen
> Tabellen genutzt werden

Was soll es denn machen? Keine Transaktionen sind keine Transaktionen.
Abgesehen davon ist das ein ganz klarer Anwender-Fehler. Wenn man weiß,
daß man für Tabelle X Transaktionen braucht (besser: solange man nicht
genau weiß, daß man keine braucht) verwendet man für Tabelle X halt
eine transaktionsfähige Engine. Und fertich.


XL

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 22.03.2006 13:42:47 von Andreas Scherbaum

Axel Schwenke wrote:
> Andreas 'ads' Scherbaum wrote:
>>
>> Natürlich ist es kein Gerücht, das Mysql Transaktionen unterstützt.
>>
>> Nur die Art und Weise ... na ja. Wie der andere Andreas hier schon schrieb,
>> keine Transaktionen auf DDL Ebene.
>
> Ja, das ist ein nettes Feature. Aber in der Praxis bei weitem nicht
> so wichtig wie Transaktionen für die Daten selber.

Für Änderungen und Probieren an der Testdatenbank ist dies ein
sehr nettes Feature, abgesehen davon, das man selbst bei umfangreicheren
Änderungen so etwas haben möchte, damit die DB zwischendurch nicht
in einem inkonsistenten Zustand ist.

Aber, ja, du hast Recht: Transaktionen für Daten sind wirklich
wichtiger.


>> Halbvollständige Daten, wenn Tabellen,
>> die nicht transaktionsfähig sind, zusammen mit transaktionsfähigen
>> Tabellen genutzt werden
>
> Was soll es denn machen? Keine Transaktionen sind keine Transaktionen.
> Abgesehen davon ist das ein ganz klarer Anwender-Fehler. Wenn man weiß,
> daß man für Tabelle X Transaktionen braucht (besser: solange man nicht
> genau weiß, daß man keine braucht) verwendet man für Tabelle X halt
> eine transaktionsfähige Engine. Und fertich.

Moment, langsam. man sollte also nach Möglichkeit immer eine transaktions-
fähige Engine nehmen? Dann fällt ja selbst der Geschwindigkeitsvorteil
weg, den Mysql bisher hat, wenn ich eine andere Engine nutzt.

Abgesehen davon: wie wäre es, wenn sich die DB schlicht weigern würde,
Aktionen in einer Transaktion auszuführen, von der sie weiss (weil falsche
Storage Engine der beteiligten Tabellen), das sie die Transaktion nicht
komplett zurückrollen kann? Das wäre konsistent, das derzeitige Verhalten
produziert Schrott.


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 22.03.2006 15:19:03 von Sven Paulus

Andreas Scherbaum wrote:
> Abgesehen davon: wie wäre es, wenn sich die DB schlicht weigern würd=
e,
> Aktionen in einer Transaktion auszuführen, von der sie weiss (weil fal=
sche
> Storage Engine der beteiligten Tabellen), das sie die Transaktion nicht
> komplett zurückrollen kann? Das wäre konsistent, das derzeitige Verh=
alten
> produziert Schrott.

Gar nicht mal, das derzeitige Verhalten kann man sogar sehr schoen
nutzen, wenn man waehrend Transaktionen Updates machen will, auf die
eben bewusst kein ROLLBACK ausgefuehrt werden soll. Z.B. wenn man ein
Verarbeitungslog schreibt, in dem auch waehrend der Transaktionen
etwas festgehalten werden soll, auch wenn diese fehlschlagen. Ich
sehe es eher als Feature denn als Bug.

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 22.03.2006 15:30:00 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 22.03.2006 15:45:33 von Sven Paulus

Andreas Kretschmer wrote:
> Und dann kracht etwas. Laut Log ist ja alles okay. Und ja, sind ja
> immerhin über 50%, die funktioniert haben...

Du hast's gar nicht verstanden.

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 22.03.2006 15:58:48 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 22.03.2006 20:45:33 von Axel Schwenke

Andreas Scherbaum wrote:
> Axel Schwenke wrote:

>> Wenn man weiß,
>> daß man für Tabelle X Transaktionen braucht (besser: solange man nicht
>> genau weiß, daß man keine braucht) verwendet man für Tabelle X halt
>> eine transaktionsfähige Engine. Und fertich.
>
> Moment, langsam. man sollte also nach Möglichkeit immer eine transaktions-
> fähige Engine nehmen?

Im Zweifelsfall - ja. Allerdings würde ich von einem DBA erwarten, daß
er die Verwendung der Tabellen vorher abschätzen kann. Notfalls ist die
transaktionsfähige Engine nur ein ALTER TABLE entfernt.

> Dann fällt ja selbst der Geschwindigkeitsvorteil
> weg, den Mysql bisher hat, wenn ich eine andere Engine nutzt.

Also *so* viel langsamer als MyISAM ist InnoDB nun auch wieder nicht.
Bei geeigneter Workload ist es manchmal sogar schneller.

> Abgesehen davon: wie wäre es, wenn sich die DB schlicht weigern würde,
> Aktionen in einer Transaktion auszuführen, von der sie weiss (weil falsche
> Storage Engine der beteiligten Tabellen), das sie die Transaktion nicht
> komplett zurückrollen kann?

Also eine angefangene Transaktion mit Fehlermeldung zurückrollen,
sobald ein Schreibversuch auf eine nicht-transaktionsfähige Tabelle
stattfindet? Oder schon beim Lesen? (was anderes als dirty reads
bekommst du ja von z.B. MyISAM nicht)

Das sollte man den User besser mit einem SQL_MODE einschalten lassen.
Wenn du das brauchst, schreib halt ein Feature-Request :-)


XL

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 22.03.2006 20:50:36 von Axel Schwenke

Andreas Kretschmer wrote:
> begin Sven Paulus schrieb:
>>
>> Du hast's gar nicht verstanden.
>
> Noch mal für Dich:
>
> wenn ich eine Transaktion haben will, dann will ich mich auch drauf
> verlassen. Und wenn ich eine TX zurückfahre, dann will ich den Zustand
> vor der TX haben, und nicht einen ungefähr so ähnlichen Zustand.

Du hast es immer noch nicht verstanden. Sven *will* ja die bisherigen
Updates gar nicht zurückrollen. Und stillschweigend (wie sich das bei
dir liest) gehen ja keine UPDATEs kaputt.

Aber wie bereits gesagt: wer Transaktionen will, soll halt seine
Tabellen mit ENGINE=InnoDB anlegen. Was ist daran problematisch?
Daß er dann keine Volltext- / spatialen Indizes haben kann?
So wie in PostgreSQL?


XL

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 22.03.2006 23:37:12 von Andreas Scherbaum

Sven Paulus wrote:
> Andreas Kretschmer wrote:
>> Und dann kracht etwas. Laut Log ist ja alles okay. Und ja, sind ja
>> immerhin über 50%, die funktioniert haben...
>
> Du hast's gar nicht verstanden.

Und du hast Transaktionen nicht verstanden.


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 22.03.2006 23:42:55 von Andreas Scherbaum

Axel Schwenke wrote:
> Andreas Scherbaum wrote:
>> Axel Schwenke wrote:
>
>> Abgesehen davon: wie wäre es, wenn sich die DB schlicht weigern würde,
>> Aktionen in einer Transaktion auszuführen, von der sie weiss (weil falsche
>> Storage Engine der beteiligten Tabellen), das sie die Transaktion nicht
>> komplett zurückrollen kann?
>
> Also eine angefangene Transaktion mit Fehlermeldung zurückrollen,
> sobald ein Schreibversuch auf eine nicht-transaktionsfähige Tabelle
> stattfindet? Oder schon beim Lesen? (was anderes als dirty reads
> bekommst du ja von z.B. MyISAM nicht)

Korrekterweise schon beim Lesen, weil ich beim Start der Transaktion
eigentlich "mein" Abbild der Datenbank haben möchte und wenn jemand
dort drin nach dem Start der Transaktion rumpfuscht, wird das
wieder inkonsistent.

Wenn der User also "will Transaktion" sagt, soll ihm die Datenbank das
auch liefern. Wenn sie das im konkreten Fall nicht kann: abbrechen.


> Das sollte man den User besser mit einem SQL_MODE einschalten lassen.
> Wenn du das brauchst, schreib halt ein Feature-Request :-)

Ich brauch das definitiv nicht. Ich sehe nur, was hier einige Leute
unter "Transaktion" verstehen bzw. sich einreden, was sie verstehen
möchten.


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: MySQL 5 - Trigger Query aus String lesen und ausführen- geht das?

am 23.03.2006 12:38:16 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de