Mist gebaut, alle Werte in Spalte auf 0 gesetzt, Trigger umkehren

  • Hab gerade voll den Bockmist geschossen und alle Werte in einer Spalte auf 0 gesetzt. :?


    Backup scheidet aus, da ich heute bereits fast 1500 neue Datensätze zugefügt habe (ich weiß, man kann auch zwischendurch sichern - weiß ich jetzt und tue es auch).


    Glücklicherweise habe ich einen Trigger mitlaufen, so das die alten Werte noch vorhanden sind.

    PHP
    1. INSERT INTO `doghistory` (`id`, `event`, `entity`, `entity_id`, `entity_property`, `value_before`, `value_after`, `last_change_by`, `created`) VALUES
    2. (193253, 'update', 'dog', '17216', 'register', 'LO124815', '0', 'admin', '2014-06-21 12:49:20'),


    wobei VALUES = id/befehl/tabelle/id_in_tabelle/spalte_in_tabelle/Wert_vorher/Wert_nachher
    so sieht eine Zeile (von fast 2000) aus .


    Hab ich eine Chance, das zurück zu wandeln und wenn ja wie genau (mag nicht experimentieren)?

  • Wenn der alte Wert in value_before steht, dann sollte das mit einem Update kein Problem sein.


    Update `doghistory` set `value_after` = `value_before`


    Aber vorher die Tabelle einmal sichern :D :D :D

  • erstmal danke für die schnelle Antwort! Schwitz Blut und Wasser...


    Das sind zwei verschiedene Tabellen (sorry, vergessen zu erwähnen). Die in der ich geändert habe ist die "dog" Spalte "register". Der Trigger ist die doghistory


    Ergo müsste ich die beiden join"en"... ???



    PHP
    1. UPDATE dog AS a
    2. INNER JOIN doghistory AS b
    3. ON a.id = b.entity_id
    4. SET `a.register` = `b.value_before`
    5. WHERE `event` = 'update'
    6. AND `entity` = 'dog'
    7. AND `entity_property` = 'register'
    8. AND `value_after` = '0'
    9. AND `last_change_by` = 'admin'
    10. AND `created` = '2014-06-21 14:49:20'


    kann ich das so wagen?

  • nö, so gehts nicht ...

    SQL
    1. UPDATE `dog`
    2. LEFT JOIN `doghistory`
    3. ON `dog.id` = `doghistory.entity_id`
    4. SET `dog.register` = `doghistory.value_before`
    5. WHERE `doghistory.event` = 'update'
    6. AND `doghistory.entity` = 'dog'
    7. AND `doghistory.entity_property` = 'register'
    8. AND `doghistory.value_after` = '0'
    9. AND `doghistory.last_change_by` = 'admin'
    10. AND `doghistory.created` = '2014-06-21 14:49:20'


    lässt mich mit der Fehlermeldung

    Code
    1. #1054 - Unknown column 'dog.register' in 'field list'


    stehen und

    SQL
    1. UPDATE dog
    2. LEFT JOIN doghistory
    3. ON dog.id = doghistory.entity_id
    4. SET dog.register = doghistory.value_before
    5. WHERE doghistory.event = 'update'
    6. AND doghistory.entity = 'dog'
    7. AND doghistory.entity_property = 'register'
    8. AND doghistory.value_after = '0'
    9. AND doghistory.last_change_by = 'admin'
    10. AND doghistory.created = '2014-06-21 14:49:20'


    gibt mir ein

    Code
    1. #1442 - Can't update table 'doghistory' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.


    scheint nach googeln ein Trigger-Problem zu sein ....


    werd ich wohl über notepad ein manuelles update erstellen müssen :smilie227:

  • für die, denen mal das gleiche Malheur passiert:


    Die obigen Update zum SELECT umgewandelt

    SQL
    1. SELECT *
    2. FROM `doghistory`
    3. WHERE `event` = 'update'
    4. AND `entity` LIKE 'dog'
    5. AND `entity_property` LIKE 'register'
    6. AND `value_before` != ''
    7. AND `value_after` LIKE '0'
    8. AND `created` = '2014-06-21 14:49:20'
    9. ORDER BY `doghistory`.`id` ASC


    Code
    1. foreach($conn->query($sql) as $row){
    2. echo "UPDATE dog SET register = '".$row['value_before']."' WHERE id = ".$row['entity_id']."<br>";
    3. }


    ABER "mein" Trigger hat hier eine "Macke" (oder eher wahrscheinlich nicht gut geproggt): er hat sich durch das direkte arbeiten in der Datenbank als bearbeitenden User den jeweils letzten genommen, so das nicht überall "admin" der Bearbeiter war - durch die anderen WHERE Klauseln konnte ich jedoch entsprechend das nötige rausholen.
    Viel Arbeit für Blödheit :oops: