mysql (neredeyse) tam denetim

0 Cevap php

Benim tablolar için basit bir olay günlüğünü yapmanın bir yol arıyorum. Ben çeşitli kullanıcılar tarafından değiştirilebilir birkaç tablo var, ve ben takip etmek istiyorsanız:

- who made the change
- when 
- what was before update
- what is the new value
- which table and which record & column

somthing gibi büyük olacak:

20:00:00 | john | update | products | 113 | product_name | "xbox" | "xbox 360"
20:00:10 | jim  | update | products | 113 | product_name | "xbox 360" | ""
20:01:00 | jim  | delete | products | 113

Yani ben tetikleyiciler cevap olabileceğini okudum ama bildiğim kadarıyla okumak gibi ben üzerinde takip etmek istediğiniz her sütun için tamamen yeni bir tablo olması gerekir gibi görünüyor. Ben değişikliği kimin oturum istiyorum çünkü tetikleyiciler de bu iş için mükemmel değildir, ve ne okudum bu mümkün değildir.

Ben CRUD (insert, update, delete) için 3 farklı işlevler yapma düşündüm ve sadece sorgu yapmadan önce değişmiş olduğunu kontrol etmek ve günlük yapmak ve sonra sorguyu çalıştırmak için. Ama burada çok yavaş ve karmaşık gibi görünüyor.

Başka iyi bir yolu var mı?

Teşekkürler


Tamam, ben yine tetikler kontrol ve benim aradığım şey değildi, bu yüzden yeni değerler farklı ise, oturum istediğiniz her sorgu için kontrol edecek basit işlevleri yazdı, ve eğer öyleyse - onu kaydeder.

Temel sorun, ve bunu ölçmek değil, ama belli ki daha yavaş.

İlk Eğer aşağıdaki gibi yeni bir mysql tablo yapmak gerekir:

  • id (A_i, birincil)
  • creation_date (datetime)
  • User_id (int)
  • table_name (TINYTEXT)
  • record_id (int)
  • cell_name (TINYTEXT)
  • action_type (TINYTEXT)
  • önceki_değeri (metin)
  • NEW_VALUE (metin)

Bundan sonra, yazma fonksiyonlarını. Ben henüz 'INSERT' ve 'delete' bölümleri yazmadım ama ben çok daha kolay olması gerektiğini düşünüyorum.

function log_query($action_type, $table, $values, $parameters){

if ($action_type == 'UPDATE'){

    log_updates($action_type, $table, $values, $parameters);

    $query = "UPDATE $table SET ";
    foreach ($values as $key => $value){
        $query .= $key."='";
        $query .= $value."', ";
    }
    unset($value);

    $query = substr($query, 0, -2);

    $query .= ' WHERE ';

    foreach ($parameters as $key => $value){
        $query .= $key."='";
        $query .= $value."' AND ";
    }
    unset($value);

    $query = substr($query, 0, -4);

    $result = mysql_query($query);

    }
} 

ve:

function log_updates($action_type, $table, $values, $parameters){
$where = " WHERE ";
$user_id = '1234'; //example
foreach ($parameters as $key => $value){
        $where .= $key."='";
        $where .= $value."' AND ";
}
unset($value);

$where = substr($where, 0, -4);

foreach ($values as $key => $value){
    $result = mysql_query("SELECT $key, id FROM $table $where");

    $row = mysql_fetch_row($result);
    $old_value = $row[0];
    $record_id = $row[1];

    if ($action_type == 'UPDATE'){
        if ($old_value != $value){
            $logger = mysql_query("INSERT INTO auditing (event_date, action_type, user_id, table_name, record_id, cell_name, old_value, new_value)
                                    VALUES (NOW(), '$action_type', $user_id, '$table', '$record_id', '$key', '$old_value', '$value')");
            if (!$logger) echo mysql_error();
        }
    } 


    }
    unset($value);

}

Önce belirli satır ve diziler için yeni değerleri bulmak için parametreleri sipariş ve bundan sonra log_query işlevini çağırmak için gereken işlevleri çağırmak için:

$update = Array('name' => 'barbara', 'description' => 'new name');
$parameters = Array('id' => '1', 'name' => 'barbi');
log_query('UPDATE', 'checktable', $update, $parameters);

This will actualy will check if the 'name' has changed and if the description is changed. for each one, if it change, it will insert new record into 'auditing' table specifying the exact change. after loging the change, it will run the update query. in our example:

UPDATE checktable SET name='barbara', description='new name' WHERE id='1' AND name='barbi'

Bu yardım umuyoruz. Şimdi ve eserleri için test edilmiştir. Güncellemeler olacak - Eğer ben burada yayınlayacağız.

alt="audit-sonra

0 Cevap