[MySQL] Variable wortwörtlich in Query einsetzen

raikkonentk

Mitglied
Hallo,

die Überschrift klingt etwas komisch, aber ich wusste nicht, wie man es besser beschreibt.

Folgendes Problem, vereinfacht dargestellt:
Ziel ist es, einen Datensatz in eine Log-Tabelle zu schreiben, bevor er geändert wird.
Dafür der folgende (vereinfachte) Trigger
Code:
CREATE TRIGGER sampleTable_bd
   BEFORE DELETE ON sampleTable
FOR EACH ROW
   BEGIN
    DECLARE previousTableValues varchar(10000);
    DECLARE columns varchar(1000);

    CALL getColumnNames(tableName, columns);

    SELECT CONCAT(columns) INTO previousTableValues FROM sampleTable WHERE id = OLD.id;

    CALL ...;
END
Wie in dem Quellcode zu sehen, gibt es eine stored Procedure "getColumnNames", die mir alle Spaltennamen für eine Tabelle ausliest. Allerdings bekomme ich die bei meiner Überlegung als String (varchar) zurück.
Code:
CREATE PROCEDURE getColumnNames(IN tableName varchar(30),OUT columnsRead varchar(1000))
BEGIN 
   SELECT group_concat(column_name SEPARATOR ',') INTO columnsRead FROM information_schema.columns WHERE table_name=tableName;
END

Und dann wird in dem Trigger bei "SELECT CONCAT(columns)" der String "columns" ausgegeben.
Also im Trigger sieht es z.B. so aus:
Code:
 SELECT CONCAT('id,description,acl') ...
Führt zu dem Ergebnis: "id,description,acl"

Aber anstatt des Strings, möchte ich das der String dazu führt, dass die tatsächlichen Inhalte der Spalten zusammengefasst werden. Dafür darf der String eben nicht als String verarbeitet werden sondern müsste wortwörtlich angewendet werden.
Ziel wäre also so:
Code:
 SELECT CONCAT(id,description,acl) ...
Führt zu dem Ergebnis "1,Inhalt der Beschreibung,ACL-Name"

Kann mir jemand helfen :) ?

Eine Alternative wäre die Spaltennamen in der Procedure in eine temporäre Tabelle zu schreiben (split_string á la http://lists.mysql.com/mysql/199134) und dann als Subquery in dem SELECT des Triggers aufzurufen, aber ich glaube da laufe ich am Ende wieder in das gleiche Problem.

Schönen 2. Weihnachtsfeiertag.
Vielen Dank.
 
Zuletzt bearbeitet:
danke für den Hinweis :)

Aber so wie ich das sehe, funktionieren prepared Statements nicht bei Triggern und stored Procedures, oder?
#1336 - Dynamic SQL is not allowed in stored function or trigger
Die stored Procedure wäre:
Code:
DELIMITER $$
CREATE PROCEDURE getPreviousTableValues (IN tableName VARCHAR(30), OUT previousValues varchar(10000))
BEGIN
   DECLARE columns VARCHAR(1000);

   CALL getColumnNames(tableName, columns);

   SET @s = CONCAT('SELECT CONCAT(',columns,') INTO previousTableValues FROM ',tableName,' AS f WHERE f.id = OLD.id');
   
   PREPARE stmt1 FROM @s;
   EXECUTE stmt1;
   DEALLOCATE PREPARE stmt1;
END$$;
DELIMITER ;

und der Trigger dazu:
Code:
DELIMITER $$
CREATE TRIGGER sampleTable_bu 
	BEFORE UPDATE ON sampleTable
FOR EACH ROW
BEGIN
   DECLARE tableName VARCHAR(30) DEFAULT 'sampleTable';
   DECLARE tableAction VARCHAR(6) DEFAULT 'UPDATE';
   DECLARE previousTableValues varchar(10000);

   CALL getPreviousTableValues(tableName, previousTableValues);

   CALL log_history(tableName,tableAction,previousTableValues);
END$$;
DELIMITER ;

Ich hab mal ein mysql 5.5.8 installiert und getestet obs in einer aktuellen Version vielleicht funktioniert - ist nicht der fall
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück