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
    INSERT INTO `doghistory` (`id`, `event`, `entity`, `entity_id`, `entity_property`, `value_before`, `value_after`, `last_change_by`, `created`) VALUES
    (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
    UPDATE dog AS a
    INNER JOIN doghistory AS b
    ON a.id = b.entity_id
    SET `a.register` = `b.value_before`
    WHERE `event` = 'update'
    AND `entity` = 'dog'
    AND `entity_property` = 'register'
    AND `value_after` = '0'
    AND `last_change_by` = 'admin'
    AND `created` = '2014-06-21 14:49:20'

    kann ich das so wagen?

  • Könntest du so wagen, aber immer auf eigene Gefahr und nicht ohne Backup ;)

  • nö, so gehts nicht ...

    SQL
    UPDATE `dog` 
    LEFT JOIN `doghistory` 
    ON `dog.id` = `doghistory.entity_id`
    SET `dog.register` = `doghistory.value_before`
    WHERE `doghistory.event` = 'update'
    AND `doghistory.entity` = 'dog'
    AND `doghistory.entity_property` = 'register'
    AND `doghistory.value_after` = '0'
    AND `doghistory.last_change_by` = 'admin'
    AND `doghistory.created` = '2014-06-21 14:49:20'


    lässt mich mit der Fehlermeldung

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


    stehen und

    SQL
    UPDATE dog 
    LEFT JOIN doghistory 
    ON dog.id = doghistory.entity_id
    SET dog.register = doghistory.value_before
    WHERE doghistory.event = 'update'
    AND doghistory.entity = 'dog'
    AND doghistory.entity_property = 'register'
    AND doghistory.value_after = '0'
    AND doghistory.last_change_by = 'admin'
    AND doghistory.created = '2014-06-21 14:49:20'


    gibt mir ein

    Code
    #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
    SELECT *
    FROM `doghistory`
    WHERE `event` = 'update'
    AND `entity` LIKE 'dog'
    AND `entity_property` LIKE 'register'
    AND `value_before` != ''
    AND `value_after` LIKE '0'
    AND `created` = '2014-06-21 14:49:20'
    ORDER BY `doghistory`.`id` ASC
    Code
    foreach($conn->query($sql) as $row){
    echo "UPDATE dog SET register = '".$row['value_before']."' WHERE id = ".$row['entity_id']."<br>";
    }

    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: