Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Архивирование удаляемых записей (Styx) 16/11/2004 - 17:24:35
      Re: Архивирование удаляемых записей (Dinky) 16/11/2004 - 18:18:37
      Re: Архивирование удаляемых записей (Styx) 16/11/2004 - 18:47:14
      Re: Архивирование удаляемых записей (Styx) 16/11/2004 - 18:53:20
      Re: Архивирование удаляемых записей (Dinky) 16/11/2004 - 19:15:36
      Re: Архивирование удаляемых записей (Styx) 16/11/2004 - 21:11:31
      Re: Архивирование удаляемых записей (Dinky) 16/11/2004 - 23:01:08
      Re: Архивирование удаляемых записей (Валентин) 17/11/2004 - 10:40:03
      Re: Архивирование удаляемых записей (Styx) 17/11/2004 - 12:45:45
      Re: Архивирование удаляемых записей (Styx) 17/11/2004 - 14:08:35
      Re: 2 Валентин (ну и 2 Styx :) (Dinky) 17/11/2004 - 18:41:35
      Re: 2 Валентин (ну и 2 Styx :) (Styx) 30/11/2004 - 21:12:22

> Original message text:
> From: Styx - 16/11/2004 - 17:24:35
> Subject:Архивирование удаляемых записей
> -----------------
> Как бы такое сделать? Перед DELETE делаю SELECT, но ведь могут удалиться другие записи из других таблиц за счёт FK ON DELETE CASCADE, а триггеров-то нету... Можно вручную искать такие записи, но как узнать про внешние ключи - только через SHOW CREATE TABLE? Как-то это... неизящно. Но очень уж не хочется дублировать одну и ту же информацию и в InnoDB, и в прикладной программе - тем более что структура данных _будет_ меняться.
>


From: Styx - 16/11/2004 - 21:11:31
Subject:Архивирование удаляемых записей
-----------------
Получилась в сыром виде такая вещь (PHP)... Но всё-таки меня не оставляет чувство, что то, что я делаю - это удаление гланд через задний проход. То есть в результате получается, что InnoDB практически и не используется!

# delete just one record by id
function doDelete($tbl, $id)
{
if (empty($tbl) || empty($id)) return;
$tbl = SQL_query_safe($tbl);
$id = intval($id);
if ($id<=0) return;
$condition = " FROM ".$tbl." WHERE id = ".$id." LIMIT 1";
$FK = getCascadedDeletes();
mysql_query("INSERT INTO `!history` (createdby, actiontype, affectedid, affectedtable, sqlcode) VALUES(".(empty($GLOBALS['userid'])?'null':$GLOBALS['userid']).", 'delete', ".$id.", '".$tbl."', '".mysql_escape_string(getBackupTable($tbl, "SELECT *".$condition, $FK))."')");
mysql_query("DELETE".$condition);
}

function getCascadedDeletes() {
#####################################################################################
# returned is array; its' keys are names of master tables and values are arrays of: #
# 0: detail table name #
# 1: master index #
# 2: detail index #
#####################################################################################
$show_tables_res = mysql_query('SHOW TABLES');
$FKeys = array();
while (list($show_table) = mysql_fetch_row($show_tables_res)) {
$show_create_table_res = mysql_query('SHOW CREATE TABLE `'.$show_table.'`');
list(,$show_create_table) = mysql_fetch_row($show_create_table_res);
mysql_free_result($show_create_table_res);
preg_match_all('#FOREIGN\s*KEY\s*\(\`?(.+?)\`?\)\s*REFERENCES\s*`?(.+?)\`?\s*\(\`?(.+?)\`?\)\s*ON\s*DELETE\s*CASCADE#i',$show_create_table,$m,PREG_SET_ORDER);
if ($m) {
foreach ($m as $fk) {
if (empty($FKeys[$fk[2]])) $FKeys[$fk[2]] = array();
$FKeys[$fk[2]][] = array($show_table, $fk[3], $fk[1]);
}
}
}
mysql_free_result($show_tables_res);
return $FKeys;
}

function getBackupString($tbl, $row)
{
foreach ($row as $key => $value) {
if (isset($flds)) {
$flds .= ", ";
$vals .= ", ";
}
$flds .= "`".$key."`";
$vals .= "'".mysql_escape_string($value)."'";
}
return "INSERT INTO `".$tbl."` ( ".$flds." ) VALUES ( ".$vals." );\r\n";
}

function getBackupTable($tbl, $query, &$FK)
{
$result = '';
$res = mysql_query($query);
while ($row = mysql_fetch_assoc($res)) {
$result .= getBackupString($tbl, $row);
if ($FK[$tbl]) {
foreach ($FK[$tbl] as $deptable) { # this WILL cause deadlock if records are safe-referenced
$result .= getBackupTable($deptable[0], "SELECT * FROM `".$deptable[0]."` WHERE `".$deptable[2]."`='".$row[$deptable[1]]."'", $FK);
}
}
}
mysql_free_result($res);
return $result;
}



[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
18791



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |