sql >> Database teknologi >  >> RDS >> Mysql

Er det muligt at se, hvilke data der blev ændret ved en forespørgsel?

OKAY. Min løsning er en kombination af PHP og MySQL for at få dette til at fungere så "gennemsigtigt" som muligt.

Disse metoder findes i en Data wrapper-klasse som bruger PDO og udarbejdede erklæringer.

Nogle forklaringer på andre anvendte metoder:

  • Data::prepareAndExecute ($query, $tokens); er en genvejsmetode, der forbereder en forespørgsel, udfører den og, hvis der er resultater, returnerer en associativ række af disse resultater.
  • Data::isSafeDatabaseEntity ($table) kontrollerer blot, at tabelnavnet passer til en preg_match ("/^([a-zA-Z0-9_]+)$/", $check); kommando for at forhindre SQL-injektion. Dette skyldes, at jeg ikke kan bruge forberedte udsagn til felt- og tabelnavne.
  • Data::tableInfo ($table); returnerer en associativ matrix af kolonnerne i en tabel baseret på information modtaget fra PDOStatement::getColumnMeta (); .
  • Data::getTablePrimaryKey ($table); bruger resultaterne af en SHOW INDEX FROM... forespørgsel. Det skal siges, at dette kun er designet til at fungere med enkeltfelts PK'er.

Uddrag fra mine Data klasse:

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. Apache underordnet proces afsluttet med status 255

  2. Postgresql indsæt trigger for at indstille værdi

  3. Lange strenge i N-Hibernate med Oracle forårsager fejl

  4. Rails:Postgres tilladelse nægtet til at oprette database på rake db:create:all