sql >> Database >  >> RDS >> Mysql

Is het mogelijk om te zien welke gegevens zijn gewijzigd door een query?

OKÉ. Mijn oplossing is een combinatie van PHP en MySQL om dit zo "transparant" mogelijk te laten werken.

Deze methoden bestaan ​​in een Data wrapper-klasse die gebruikmaakt van PDO en voorbereide instructies.

Enige uitleg van andere gebruikte methoden:

  • Data::prepareAndExecute ($query, $tokens); is een snelkoppelingsmethode die een query voorbereidt, uitvoert en, als er resultaten zijn, een associatieve array van die resultaten retourneert.
  • Data::isSafeDatabaseEntity ($table) controleert eenvoudig of de tabelnaam past bij een preg_match ("/^([a-zA-Z0-9_]+)$/", $check); commando om SQL-injectie te voorkomen. Dit komt omdat ik geen voorbereide instructies voor veld- en tabelnamen kan gebruiken.
  • Data::tableInfo ($table); retourneert een associatieve array van de kolommen in een tabel op basis van informatie ontvangen van PDOStatement::getColumnMeta (); .
  • Data::getTablePrimaryKey ($table); gebruikt de resultaten van een SHOW INDEX FROM... vraag. Het moet gezegd worden dat dit is ontworpen om alleen met single-field PK's te werken.

Uittreksels uit mijn Data klas:

public static function addTableLogging ($table, $ignorecolumns = array ())
{
    if (Data::isSafeDatabaseEntity ($table))
    {
        $update_trigger = "CREATE TRIGGER `{$table}_after_update` AFTER UPDATE ON `{$table}` FOR EACH ROW BEGIN\n";
        $insert_trigger = "CREATE TRIGGER `{$table}_after_insert` AFTER INSERT ON `{$table}` FOR EACH ROW BEGIN\n";
        $columns = Data::tableInfo ($table);
        $pk = Data::getTablePrimaryKey ($table);
        foreach ($columns as $column)
        {
            if (!in_array ($column ['name'], $ignorecolumns))
            {
                $update_trigger .= "   IF (NEW.{$column ['name']} != OLD.{$column ['name']}) THEN
     CALL changelog_store ('{$table}', OLD.{$pk}, '{$column ['name']}', OLD.{$column ['name']}, NEW.{$column ['name']});
  END IF;\n";
                $insert_trigger .= "   CALL changelog_store ('{$table}', NEW.{$pk}, '{$column ['name']}', '', NEW.{$column ['name']});\n";
            }
        }
        $update_trigger .= "END";
        $insert_trigger .= "END";

        self::removeTableLogging ($table);
        self::prepareAndExecute ($update_trigger);
        self::prepareAndExecute ($insert_trigger);
    }
}

public static function removeTableLogging ($table)
{
    if (self::isSafeDatabaseEntity ($table))
    {
        Data::prepareAndExecute ("DROP TRIGGER IF EXISTS `{$table}_after_update`;");
        Data::prepareAndExecute ("DROP TRIGGER IF EXISTS `{$table}_after_insert`;");
    }
}

public static function refreshLoggingProcedure ()
{
    /* -- for logging into MySQL Table:
      CREATE TABLE `changelog` (
        `change_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
        `change_table` VARCHAR(50) NULL DEFAULT NULL,
        `change_table_id` VARCHAR(25) NULL DEFAULT NULL,
        `change_field` VARCHAR(50) NULL DEFAULT NULL,
        `change_old` VARCHAR(255) NULL DEFAULT NULL,
        `change_new` VARCHAR(255) NULL DEFAULT NULL,
        `change_user` INT(10) UNSIGNED NOT NULL DEFAULT '0',
        `change_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
        PRIMARY KEY (`change_id`),
        INDEX `change_table_id` (`change_table_id`),
        INDEX `change_table` (`change_table`, `change_field`)
      );
    */
    $logquery = "CREATE PROCEDURE `changelog_store`(IN `tab` VARCHAR(50), IN `pkval` INT, IN `fieldn` VARCHAR(50), IN `oldv` TEXT, IN `newv` TEXT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
    IF ISNULL(@STAFFID) THEN
        SET @STAFFID = 0;
    END IF;
    INSERT INTO `changelog` (change_table, change_table_id, change_field, change_old, change_new, change_date, change_user)
        VALUES (tab, pkval, fieldn, oldv, newv, NOW(), @STAFFID);
END";
    Data::prepareAndExecute ("DROP PROCEDURE IF EXISTS `changelog_store`;");
    Data::prepareAndExecute ($logquery);
}



  1. Hoe kan ik zoeken in een tabel met door komma's gescheiden waarden?

  2. MySQL hoe innodb-log-bestandsgrootte te veranderen

  3. MySQL GRADEN() Functie – Converteren van radialen naar graden

  4. CURTIME() Voorbeelden – MySQL