Rasteabilidade de alterações

1. Rasteabilidade de alterações

Alexandre Radis
aradis

(usa Ubuntu)

Enviado em 18/04/2011 - 12:48h

Prezados,

Me deparei com um problema que pode ser resumido da seguinte forma, "preciso descobrir rapidamente qual foi o histórico de alteração de uma registro da tabela e rapidamente retornar ao registro que estava correto".
Para isso utilizei trigger que busca o registro antigo antes da alteração/exclusão e carrega em uma tabela auxiliar e bolei um script em php para gerar essa trigger e a tabela auxiliar para qualquer tabela, segue o script.
print "<div id=\"corpo\">";
if(isset($_POST["tabela"])&&$_POST["tabela"])
{
$tabela=$_POST["tabela"];
print "<h3>$tabela</h3>";
$sql="SHOW COLUMNS FROM $tabela";
$rs = mysql_query($sql);
if ($rs)
{
print "<table border=\"1\" valign=\"top\"><tr><td>\n";
if($linhas=mysql_num_rows($rs))
{
$colunas=mysql_num_fields($rs);
for($i=0;$i<$linhas;$i++)
{
for($j=0;$j<$colunas;$j++)
$campo[$i][mysql_field_name($rs,$j)]=mysql_result($rs,$i,$j);
if($campo[$i]["Null"]=='YES')$campo[$i]["Null"]="";
else $campo[$i]["Null"]='NOT NULL ';
}
$campo[0]["Extra"]="";
$campo[0]["Key"]="";
print "<pre>";
print_r($campo);
print "</pre>";
}
print "</td><td>";
$backup="bkp".substr($tabela,3);
$len=strlen($campo[0]["Field"])-3;
$bkp_cod=substr($campo[0]["Field"],0,$len)."bkp";
$sql = "CREATE TABLE IF NOT EXISTS `$backup` (\n";
$sql = $sql." `$bkp_cod` int(11) NOT NULL AUTO_INCREMENT, \n";
for($i=0;$i<$linhas;$i++)
{
$sql = $sql." `".$campo[$i]["Field"]."` ".$campo[$i]["Type"];
$sql = $sql." ".$campo[$i]["Null"];
if($campo[$i]["Default"]<>"")
$sql = $sql." DEFAULT '".$campo[$i]["Default"]."'";
$sql = $sql.",\n";
}
$sql = $sql." PRIMARY KEY (`$bkp_cod`)\n";
$sql = $sql.") ENGINE=InnoDB DEFAULT CHARSET=utf8;\n";
print "<pre>$sql</pre>";
if($rs=mysql_query($sql))$erro="Tabela de backup criada/mantida com sucesso";
else $erro="Problema para criar tabela de Backup".mysql_error();
print "<h3>$erro</h3>";
print "<hr />";
$sqlinsert=$campo[0]["Field"];
$sqlvalores="OLD.".$campo[0]["Field"];
for($i=1;$i<$linhas;$i++)
{
$sqlinsert=$sqlinsert.", ".$campo[$i]["Field"];
$sqlvalores=$sqlvalores.", OLD.".$campo[$i]["Field"];
}
$acao=substr($tabela,4)."_update";
$sql = "DROP TRIGGER IF EXISTS `$banco`.`$acao`;\n";
if($rs=mysql_query($sql))$erro="Trigger de update apagada com sucesso";
else $erro="Problema para apagar trigger de update";
print "<h3>$erro</h3>";
$sql = "CREATE TRIGGER `$banco`.`$acao` BEFORE UPDATE ON `$banco`.`$tabela`\n";
$sql = $sql."FOR EACH ROW BEGIN\n";
$sql = $sql."insert into $backup($sqlinsert)\nvalues($sqlvalores);\n";
$sql = $sql."END\n";
print "<pre>$sql</pre>";
if($rs=mysql_query($sql))$erro="Trigger de update criada com sucesso";
else $erro="Problema para criar trigger de update";
print "<h3>$erro</h3>";
$acao=substr($tabela,4)."_delete";
$sql = "DROP TRIGGER IF EXISTS `$banco`.`$acao`;\n";
if($rs=mysql_query($sql))$erro="Trigger de exclusão apagada com sucesso";
else $erro="Problema para apagar trigger de exclusão";
print "<h3>$erro</h3>";
$sql = "CREATE TRIGGER `$banco`.`$acao` BEFORE DELETE ON `$banco`.`$tabela`\n";
$sql = $sql."FOR EACH ROW BEGIN\n";
$sql = $sql."insert into $backup($sqlinsert)\nvalues($sqlvalores);\n";
$sql = $sql."END\n";
print "<pre>$sql</pre>";
if($rs=mysql_query($sql))$erro="Trigger de exclusão criada com sucesso";
else $erro="Problema para trigger de exclusão";
print "<h3>$erro</h3>";
print "</td></tr></table>";
}
else{
echo 'Não pode rodar a query $sql: ' . mysql_error();
exit;
}
}

Será que esse é o caminho correto? oque pode ser melhorado?

Discussão em aberto.


  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts