, * Andreas Oesterreicher , * Rudolf Hangl and * Gerald Simane-Sequens */ /* * Script zur Pruefung der Datenbank * * database.inc.php enthaelt die Struktur der Datenbank. Diese wird mit der Produktivdatenbank * verglichen und eventuelle Aenderungen werden angezeigt. */ require_once('../config/system.config.inc.php'); require_once('database.inc.php'); require_once('../include/functions.inc.php'); require_once('../include/benutzerberechtigung.class.php'); $db = new basis_db(); $uid=get_uid(); $rechte = new benutzerberechtigung(); $rechte->getBerechtigungen($uid); if(!$rechte->isBerechtigt('admin')) die('Sie haben keine Berechtigung fuer diese Seite'); echo ' Datenbank Check '; echo '

Datenbank Prüfung

'; if(isset($_POST['commit'])) { if(isset($_POST['qry'])) { if(!$db->db_query($_POST['qry'])) echo $db->db_last_error(); } } $obj=array(); $obj['']=array(); $obj['']['error']=false; //Schema pruefen foreach ($schemas as $schema) { $obj[$schema['name']]=array(); $obj[$schema['name']]['error']=false; $qry = "SELECT table_schema FROM information_schema.tables WHERE table_schema='".$schema['name']."'"; if($db->db_query($qry)) { if(!$db->db_num_rows()>0) { $obj[$schema['name']]['qry']='CREATE SCHEMA '.$schema['name'].';'; $obj[$schema['name']]['error']=true; } } } //var_dump($datatypes); $tabs=array_keys($tabellen); //print_r($tabs); $i=0; foreach ($tabellen AS $tabelle) { if(!isset($tabelle['schemaid']) || $tabelle['schemaid']=='') { //Tabelle auslassen, wenn kein Schema angegeben ist echo 'Tabelle '.$tabelle['name'].' ist keinem Schema zugeordnet!
'; continue; } $obj[$schemas[$tabelle['schemaid']]['name']]['tables'][$tabelle['name']]=array(); $sql_query2=''; $pk=''; // Tabelle pruefen $sql_query="SELECT table_name FROM information_schema.tables WHERE table_schema='".$schemas[$tabelle['schemaid']]['name']."' AND table_name='".$tabelle['name']."';"; if (!$db->db_query($sql_query)) echo '
'.$tabs[$i].': '.$db->db_last_error().'
'; else { if ($db->db_num_rows()==0) { $sql_query= 'CREATE TABLE '.$schemas[$tabelle['schemaid']]['name'].'.'.$tabelle['name']." ("; foreach ($tabelle['attribute'] AS $attribut) { if ($datatypes[$attribut['datatypeid']]['name']!='geometry') { $sql_query.= $attribut['name'].' '; if ($attribut['pk']) $pk.=$attribut['name'].','; $sql_query.=$datatypes[$attribut['datatypeid']]['name']; if ($datatypes[$attribut['datatypeid']]['length']==1) $sql_query.='('.$attribut['datatypeparam1'].')'; if ($datatypes[$attribut['datatypeid']]['length']==2) $sql_query.='('.$attribut['datatypeparam1'].','.$attribut['datatypeparam2'].')'; if ($attribut['notnull']) $sql_query.=' NOT NULL'; if ($attribut['unique']) $sql_query.=' UNIQUE'; if ($attribut['defaultvalue']!="") $sql_query.=' DEFAULT '.$attribut['defaultvalue']; if ($attribut['checkconstraint']!="") $sql_query.=' CHECK ('.$attribut['checkconstraint'].')'; $sql_query.=', '; } else $sql_query2.="SELECT AddGeometryColumn('','".$tabelle['name']."','".$attribut['name']."',-1,'POINT',2);"; } $sql_query=substr($sql_query,0,-2); if ($pk!="") $sql_query.=', CONSTRAINT "pk_'.$schemas[$tabelle['schemaid']]['name'].'_'.$tabelle['name'].'" PRIMARY KEY ('.substr($pk,0,-1).')'; $sql_query.=');'; $obj[$schemas[$tabelle['schemaid']]['name']]['tables'][$tabelle['name']]['qry']=$sql_query; $obj[$schemas[$tabelle['schemaid']]['name']]['error']=true; } else { // Attribute pruefen foreach ($tabelle['attribute'] AS $attribut) { $obj[$schemas[$tabelle['schemaid']]['name']]['tables'][$tabelle['name']]['attribute'][$attribut['name']]=array(); $qry_query="SELECT column_name FROM information_schema.columns WHERE table_schema=".$schemas[$tabelle['schemaid']]['name']."' AND table_name='".$tabelle['name']."' AND column_name='".$attribut['name']."'; "; if ($db->db_query($sql_query)) { if ($db->db_num_rows()==0) { $sql_query_nn=''; $sql_query='ALTER TABLE '.$schemas[$tabelle['schemaid']]['name'].'.'.$tabelle['name'].' ADD COLUMN '.$attribut['name'].' '; $sql_query.=$datatypes[$attribut['datatypeid']]['name']; if ($datatypes[$attribut['datatypeid']]['length']==1) $sql_query.='('.$attribut['datatypeparam1'].')'; if ($datatypes[$attribut['datatypeid']]['length']==2) $sql_query.='('.$attribut['datatypeparam1'].','.$attribut['datatypeparam2'].')'; if ($attribut['unique']) $sql_query.=' UNIQUE'; if ($attribut['defaultvalue']!="") $sql_query.=' DEFAULT '.$attribut['defaultvalue']; else $attribut['defaultvalue']=$datatypes[$attribut['datatypeid']]['default']; if ($attribut['checkconstraint']!="") $sql_query.=' CHECK ('.$attribut['checkconstraint'].')'; if ($attribut['notnull']) { $sql_query_nn.='UPDATE '.$schemas[$tabelle['schemaid']]['name'].'.'.$tabelle['name'].' SET '.$attribut['name'].'='.$attribut['defaultvalue'].';'; $sql_query_nn.='ALTER TABLE '.$schemas[$tabelle['schemaid']]['name'].'.'.$tabelle['name'].' ALTER COLUMN '.$attribut['name'].' SET NOT NULL;'; } $sql_query.=';'; $obj[$schemas[$tabelle['schemaid']]['name']]['tables'][$tabelle['name']]['attribute'][$attribut['name']]['qry']=$sql_query; $obj[$schemas[$tabelle['schemaid']]['name']]['error']=true; $obj[$schemas[$tabelle['schemaid']]['name']]['tables'][$tabelle['name']]['error']=true; } $obj[$schemas[$tabelle['schemaid']]['name']]['tables'][$tabelle['name']]['attribute'][$attribut['name']]['datatype']=$datatypes[$attribut['datatypeid']]['name']; $obj[$schemas[$tabelle['schemaid']]['name']]['tables'][$tabelle['name']]['attribute'][$attribut['name']]['attribute']=$attribut; } } } } flush(); $i++; } // Constraints pruefen function getTablenameFromAttributIDs($attr) { global $tabellen; global $schemas; $attributid=null; foreach ($attr AS $attribut) $attributid=$attribut; foreach ($tabellen AS $tabelle) foreach ($tabelle['attribute'] AS $attribut) if ($attribut['id']==$attributid) { if(isset($tabelle['schemaid'])) return $schemas[$tabelle['schemaid']]['name'].'.'.$tabelle['name']; else return 'public.'.$tabelle['name']; } return false; } function getAttributesnameFromAttributIDs($attr) { global $tabellen; global $schemas; $attributes=''; foreach ($attr AS $attributid) foreach ($tabellen AS $tabelle) foreach ($tabelle['attribute'] AS $attribute) if ($attribute['id']==$attributid) $attributes.=$attribute['name'].', '; return substr($attributes,0,-2); } foreach ($relations AS $relation) { $sql_query=''; $pk=''; // Auf Foreign Key pruefen if (count($relation['foreignkeys'])>0) { $parentattr=''; $childattr=''; foreach ($relation['foreignkeys'] AS $foreignkey) { $sql_query=''; $parenttable=getTablenameFromAttributIDs($foreignkey['attrparent']); $childtable=getTablenameFromAttributIDs($foreignkey['attrchild']); $parentattr.=getAttributesnameFromAttributIDs($foreignkey['attrparent']).', '; $childattr.=getAttributesnameFromAttributIDs($foreignkey['attrchild']).', '; } $parentattr = substr($parentattr, 0, -2); $childattr = substr($childattr, 0, -2); list($schema, $tablename) = explode(".", $childtable); $qry = "SELECT 1 FROM information_schema.key_column_usage WHERE table_schema='".$schema."' AND table_name='".$tablename."' AND constraint_name='".$relation['name']."'"; if($db->db_query($qry)) { if($db->db_num_rows()==0) { $sql_query='ALTER TABLE '.$childtable.' ADD CONSTRAINT '.$relation['name'].' FOREIGN KEY ('.$childattr.') REFERENCES '.$parenttable.' ('.$parentattr.') '; $sql_query.='ON UPDATE CASCADE ON DELETE RESTRICT;'; if(isset($obj[$schema]) && isset($obj[$schema]['tables'][$tablename]) && isset($obj[$schema]['tables'][$tablename]['attribute']) && isset($obj[$schema]['tables'][$tablename]['attribute'][$childattr]['qry'])) $obj[$schema]['tables'][$tablename]['attribute'][$childattr]['qry'].=$sql_query; else $obj[$schema]['tables'][$tablename]['attribute'][$childattr]['qry']=$sql_query; $obj[$schema]['error']=true; $obj[$schema]['tables'][$tablename]['error']=true; } } } flush(); $i++; } // Gegenpruefung //Prueft ob ein Schema in database.inc.php vorhanden ist function schemaExists($schema) { global $schemas; foreach ($schemas AS $schemata) { if($schemata['name']==$schema) return true; } return false; } //Prueft ob eine Tabelle in database.inc.php vorhanden ist function tableExists($schema, $table) { global $schemas; global $tabellen; foreach ($schemas AS $schemata) { if($schemata['name']==$schema) $schemaid=$schemata['id']; } foreach ($tabellen as $tabelle) { if($tabelle['name']==$table && $tabelle['schemaid']==$schemaid) return true; } return false; } //Prueft ob eine Tabelle in database.inc.php vorhanden ist function attributExists($schema, $table, $attribut) { global $schemas; global $tabellen; foreach ($schemas AS $schemata) { if($schemata['name']==$schema) $schemaid=$schemata['id']; } foreach ($tabellen as $tabelle) { if($tabelle['name']==$table && $tabelle['schemaid']==$schemaid) { foreach($tabelle['attribute'] as $attr) { if($attr['name']==$attribut) return true; } return false; } } return false; } // Schema $additionalElements=''; $sql_query="SELECT table_schema FROM information_schema.tables WHERE table_schema != 'pg_catalog' AND table_schema != 'information_schema' AND table_schema != 'sync' AND table_schema != 'papaya' GROUP BY table_schema"; if ($result=$db->db_query($sql_query)) { while ($row_schema=$db->db_fetch_object($result)) { if (!schemaExists($row_schema->table_schema)) { $additionalElements.='Schema '.$row_schema->table_schema."\n"; } else { //Tabellen $qry = "SELECT table_name FROM information_schema.tables WHERE table_schema='".$row_schema->table_schema."'"; if ($result_table=$db->db_query($qry)) { while($row_table = $db->db_fetch_object($result_table)) { if(!tableExists($row_schema->table_schema, $row_table->table_name)) { $additionalElements.='Tabelle '.$row_schema->table_schema.'.'.$row_table->table_name."\n"; } else { //Attribute $qry = "SELECT column_name FROM information_schema.columns WHERE table_schema='".$row_schema->table_schema."' AND table_name='".$row_table->table_name."'"; if($result_attrib = $db->db_query($qry)) { while($row_attrib = $db->db_fetch_object($result_attrib)) { if(!attributExists($row_schema->table_schema, $row_table->table_name, $row_attrib->column_name)) { $additionalElements.='Attribut '.$row_schema->table_schema.'.'.$row_table->table_name.'.'.$row_attrib->column_name."\n"; } else { //KEYs Pruefen } } } } } } } } } $out_schema="\n"; $out_schema_data="\n"; $out_tbl="\n"; $out_tbl_data="\n"; $out_att="\n"; $out_att_data="\n"; function querybox($title, $qry, $id) { $ret="\n"; $ret.=''; return $ret; } $out_schema.= '
'; $out_schema.= '
Schema
'; $out_schema.= ''; $gesamtqry = ''; $gesamtqry_att=''; foreach ($obj as $schema=>$value) { //Schema $out_schema.= "\n"; $out_schema.= ''; if($value['error']) { if(isset($value['qry']) && $value['qry']!='') { $gesamtqry .= $value['qry']."\n"; $out_schema_data.=querybox($schema, $value['qry'], 'schema.'.$schema); $img = "exclamation.png"; } else { $img = "error_go.png"; } $out_schema.= ''; $out_schema.= ''; } else { $out_schema.= ''; $out_schema.= ''; } $out_schema.= ''; //Tabelle if(isset($value['tables'])) { $out_tbl.= "\n"; $out_tbl.= '
'.$schema.''.$schema.'
'; foreach ($value['tables'] as $tables=>$tabvalue) { $out_tbl.= ''; if(isset($tabvalue['qry']) && $tabvalue['qry']!='') { $gesamtqry .= $tabvalue['qry']."\n"; $out_tbl.= ''; $out_tbl.= ''; $out_tbl_data.=querybox($tables, $tabvalue['qry'], 'table.'.$schema.$tables); } else { if(isset($tabvalue['error']) && $tabvalue['error']) { $out_tbl.= ''; $out_tbl.= ''; } else { $out_tbl.= ''; $out_tbl.= ''; } } $out_tbl.= ''; //Attribute if(isset($tabvalue['attribute'])) { $out_att.= "\n"; $out_att.= '
'.$tables.''.$tables.''.$tables.'
'; foreach ($tabvalue['attribute'] as $attrib=>$attvalue) { $out_att.= ''; if(isset($attvalue['qry']) && $attvalue['qry']!='') { $gesamtqry_att .= $attvalue['qry']."\n"; $out_att.= ''; $out_att.= ''; $out_att_data.=querybox($attrib, $attvalue['qry'], 'attrib.'.$schema.$tables.$attrib); } else { $out_att.= ''; $out_att.= ''; $out_att.= ''; $out_att.= ''; } $out_att.= ''; } $out_att.= '
'.$attrib.''.$attrib.' '.(isset($attvalue['datatype'])?$attvalue['datatype']:'').($attvalue['attribute']['length']!=''?' ('.$attvalue['attribute']['length'].')':'').' '. (isset($attvalue['attribute'])?($attvalue['attribute']['unique']=='1'?'U':''):''). (isset($attvalue['attribute'])?($attvalue['attribute']['notnull']=='1'?'NN':''):''). '
'; $out_att.= '
'; } } $out_tbl.= ''; $out_tbl.= ''; } } $out_schema.= ''; $out_schema.= ''; echo 'Gesamtsystem aktualisieren  '; echo 'Element die in der DB sind, aber nicht in diesem Script
'; echo $out_schema; echo querybox('Gesamtsystem aktualisieren',$gesamtqry.$gesamtqry_att, 'schema.gesamtqry'); echo querybox('Element die in der DB sind, aber nicht in diesem Script',$additionalElements, 'schema.additionalelements'); echo $out_schema_data; echo $out_tbl; echo $out_tbl_data; echo $out_att; echo $out_att_data; ?>