
		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.