Bij verify data ook foutieve tabelnamen en views die niet in XXXX.sql zitten controleren

svn path=/Website/branches/v2017.3/; revision=37596
This commit is contained in:
Jos Groot Lipman
2018-04-10 15:34:20 +00:00
parent a44abe5ed8
commit 11b0a1ed8d

View File

@@ -162,7 +162,7 @@ function checker (description, fnCheck, toggler)
%><table>
<thead><tr><th>fac_verify_data.asp $Revision$ <input type='button' onclick='reload()' value='Refresh'>
<br>Checking <%= (new Date).toLocaleString() %>
<br>Checking <%= toDateTimeString(new Date(), true) %>
<br>Customer: <%=customerId%>
<br>Database: <%=Oracle.RealConnection.Properties("User Name")+'@'+Oracle.RealConnection.Properties("Data source") %>
<% if (user_key > 0) Response.Write("<br>User: " + user.naam()); %>
@@ -171,6 +171,67 @@ function checker (description, fnCheck, toggler)
<%
//------------------------------------------------------------------------------
// Check for other queries that should yield no records
__GROUP = "DATABASE META CONSISTENTIE";
checker("Meta consistentie van de database, belangrijk om te controleren voor oplevering",
function ()
{
var noResults = [{ msg: "FAC_VERSION is niet goed gevuld",
sql: "SELECT * FROM fac_version"
+ " WHERE fac_version_cust IS NULL"
// Deprecated + " OR fac_version_custnr IS NULL"
// Deprecated + " OR fac_version_otap IS NULL"
+ " OR fac_version_lang IS NULL"
},
{ msg: "FAC_VERSION is ongelijk aan customerId",
sql: "SELECT * FROM fac_version"
+ " WHERE UPPER(fac_version_cust) <> " + safe.quoted_sql(customerId)
},
{ msg: "'Vervangen imports' moeten weggehaald worden (of naar WEB_FACFAC)",
sql: "SELECT *"
+ " FROM fac_import_app fia, fac_functie ff"
+ " WHERE fac_import_app_code LIKE '%_DEL' "
+ " AND fia.fac_functie_key = ff.fac_functie_key"
+ " AND fac_functie_code <> 'WEB_FACFAC'"
},
{ msg: "Datatype MLD_T_UITVOERTIJD.TIJDSDUUR is te klein (gebruik DB23aTO23b.sql)",
sql: "SELECT type_name, attr_name, precision"
+ " FROM user_type_attrs"
+ " WHERE type_name = 'MLD_T_UITVOERTIJD' "
+ " AND attr_name = 'TIJDSDUUR'"
+ " AND precision < 12"
},
{ msg: "Vreemde tabelnamen die waarschijnlijk gedropped moeten worden",
sql: "SELECT *" +
" FROM user_objects" +
" WHERE SUBSTR (object_name, 1, 4) NOT IN ('ALG_', 'ADM_', 'AUT_', 'BGT_', 'BES_', 'BEZ_'," +
" 'CAD_', 'CNT_', 'CTR_', 'FAC_', 'FAQ_', 'FIN_'," +
" 'IMP_', 'INS_', 'KPI_', 'MAR_', 'MLD_', 'MRK_'," +
" 'MSG_', 'PRJ_', 'PRS_', 'RES_', 'WEB_')" +
" AND SUBSTR(object_name, 1, 5) NOT IN('PCHX_', 'CARE_', 'AAXX_')" +
" AND object_name NOT LIKE SUBSTR(USER, 1, 4) || '%'" +
" AND object_name NOT LIKE 'T_' || SUBSTR(USER, 1, 4) || '%'" +
" AND object_type = 'TABLE'" +
" ORDER BY object_name"
},
{ msg: "Views niet gewijzigd met de laatste {0}.sql. Deze moeten waarschijnlijk gedropped worden of opgenomen in {0}.sql".format(customerId),
sql: "SELECT object_name, created, last_ddl_time," +
" (SELECT MAX (adm_tracking_date)" +
" FROM adm_tracking" +
" WHERE UPPER (adm_tracking_name) = SUBSTR(USER, 1, 4) || '.SQL') \"last {0}.sql\"".format(customerId) +
" FROM user_objects" +
" WHERE object_type = 'VIEW'" + // 'CREATE OR REPPLACE PROCEDURE werkt ddl_time helaas niet bij lijkt het
" AND object_name LIKE SUBSTR(USER, 1, 4) || '%'" +
" AND last_ddl_time < (SELECT MAX (adm_tracking_date)" +
" FROM adm_tracking" +
" WHERE UPPER (adm_tracking_name) = SUBSTR(USER, 1, 4) || '.SQL') -1"
}];
return fnNoresults(noResults);
}
)
__GROUP = "DATABASE CONSISTENTIE";
// check the disc_params tables that should have an equal number of records
checker("Controle xxx-disc_params",
@@ -226,36 +287,65 @@ checker("Controle xxx-disc_params",
}
)
function fnNoresults(noResults)
{
var messages = [];
for (noResult in noResults)
{
if (!Response.IsClientConnected)
{
__DoLog("Response.IsClientConnected false, Aborting.", "#00FF00");
Response.End;
}
var oRs = Oracle.Execute("SELECT COUNT(*) FROM ("+noResults[noResult].sql+")");
var cnt = oRs(0);
if (cnt>0)
{
var txt = ["<span class='fcltmsg'>" + noResults[noResult].msg + " ("+cnt+")</span>",
"<span class='fcltsql'>" + noResults[noResult].sql + "</span>"];
if (cnt < 10) // Dan tonen we de data
{
oRs.Close();
var oRs = Oracle.Execute(noResults[noResult].sql);
tbl = ["<table>", "<thead>", "<tr>"];
for (var i = 0; i < oRs.Fields.Count && i < 5; i++)
{
tbl.push("<th style='text-align:left'>" + safe.html(oRs.Fields(i).Name) + "</th>");
}
tbl.push("</tr>");
tbl.push("</thead>");
while (!oRs.Eof)
{
tbl.push("<tr>");
for (var i = 0; i < oRs.Fields.Count && i < 5; i++)
{
tbl.push("<td>" + safe.html(oRs(i).Value) + "</td>");
}
tbl.push("</tr>");
oRs.MoveNext();
}
tbl.push("</table>");
txt.push(tbl.join(""));
}
messages.push(txt.join("<br>"));
}
oRs.Close();
}
if (!messages.length)
return { result: resultcodes.ok,
info: String(noResults.length) + " checks",
message: "No problems detected" };
else
return { result: resultcodes.error,
info: String(noResults.length) + " checks",
message: messages.join("\n<p>") };
}
// Check for other queries that should yield no records
checker("Controle queries die geen records mogen opleveren",
function ()
{
var noResults = [{ msg: "FAC_VERSION is niet goed gevuld",
sql: "SELECT * FROM fac_version"
+ " WHERE fac_version_cust IS NULL"
// Deprecated + " OR fac_version_custnr IS NULL"
// Deprecated + " OR fac_version_otap IS NULL"
+ " OR fac_version_lang IS NULL"
},
{ msg: "FAC_VERSION is ongelijk aan customerId",
sql: "SELECT * FROM fac_version"
+ " WHERE UPPER(fac_version_cust) <> " + safe.quoted_sql(customerId)
},
{ msg: "'Vervangen imports' moeten weggehaald worden (of naar WEB_FACFAC)",
sql: "SELECT *"
+ " FROM fac_import_app fia, fac_functie ff"
+ " WHERE fac_import_app_code LIKE '%_DEL' "
+ " AND fia.fac_functie_key = ff.fac_functie_key"
+ " AND fac_functie_code <> 'WEB_FACFAC'"
},
{ msg: "Datatype MLD_T_UITVOERTIJD.TIJDSDUUR is te klein (gebruik DB23aTO23b.sql)",
sql: "SELECT type_name, attr_name, precision"
+ " FROM user_type_attrs"
+ " WHERE type_name = 'MLD_T_UITVOERTIJD' "
+ " AND attr_name = 'TIJDSDUUR'"
+ " AND precision < 12"
},
// meldingen met flexkenmerken van verschillende stdmeldingen *tegelijk*
var noResults = [// meldingen met flexkenmerken van verschillende stdmeldingen *tegelijk*
// Dit is in de praktijk ook problematisch (FSN#18613):
{ msg: "meldingen met mld-flexkenmerken van verschillende stdmeldingen. Problematisch (FSN#18613)",
sql: "SELECT mld_melding_key, COUNT ( * )"
@@ -523,6 +613,7 @@ checker("Controle queries die geen records mogen opleveren",
+ " AND rsk.res_srtkenmerk_kenmerktype IN ('D') "
+ " AND res_kenmerk_default IS NOT NULL "
+ " AND res_kenmerk_verwijder IS NULL "
+ " AND res_kenmerk_default NOT LIKE '##SQL##%'"
},
{ msg: "MLD referentie kenmerken met ongeldige default",
sql: "SELECT mk.mld_kenmerk_key, mld_srtkenmerk_omschrijving, mld_srtkenmerk_kenmerktype, mld_kenmerk_default"
@@ -532,6 +623,7 @@ checker("Controle queries die geen records mogen opleveren",
+ " AND mld_kenmerk_default IS NOT NULL "
+ " AND mld_kenmerk_verwijder IS NULL "
+ " AND fac.safe_to_number (mld_kenmerk_default) IS NULL "
+ " AND mld_kenmerk_default NOT LIKE '##SQL##%'"
},
{ msg: "MLD datum kenmerken met default, zeer onwaarschijnlijk",
sql: "SELECT mk.mld_kenmerk_key, mld_srtkenmerk_omschrijving, mld_srtkenmerk_kenmerktype, mld_kenmerk_default"
@@ -762,57 +854,7 @@ checker("Controle queries die geen records mogen opleveren",
+ " SELECT prs_werkplek_key FROM prs_perslidwerkplek"
}
)
var messages = [];
for (noResult in noResults)
{
if (!Response.IsClientConnected)
{
__DoLog("Response.IsClientConnected false, Aborting.", "#00FF00");
Response.End;
}
var oRs = Oracle.Execute("SELECT COUNT(*) FROM ("+noResults[noResult].sql+")");
var cnt = oRs(0);
if (cnt>0)
{
var txt = ["<span class='fcltmsg'>" + noResults[noResult].msg + " ("+cnt+")</span>",
"<span class='fcltsql'>" + noResults[noResult].sql + "</span>"];
if (cnt < 10) // Dan tonen we de data
{
oRs.Close();
var oRs = Oracle.Execute(noResults[noResult].sql);
tbl = ["<table>", "<thead>", "<tr>"];
for (var i = 0; i < oRs.Fields.Count && i < 5; i++)
{
tbl.push("<th style='text-align:left'>" + safe.html(oRs.Fields(i).Name) + "</th>");
}
tbl.push("</tr>");
tbl.push("</thead>");
while (!oRs.Eof)
{
tbl.push("<tr>");
for (var i = 0; i < oRs.Fields.Count && i < 5; i++)
{
tbl.push("<td>" + safe.html(oRs(i).Value) + "</td>");
}
tbl.push("</tr>");
oRs.MoveNext();
}
tbl.push("</table>");
txt.push(tbl.join(""));
}
messages.push(txt.join("<br>"));
}
oRs.Close();
}
if (!messages.length)
return { result: resultcodes.ok,
info: String(noResults.length) + " checks",
message: "No problems detected" };
else
return { result: resultcodes.error,
info: String(noResults.length) + " checks",
message: messages.join("\n<p>") };
return fnNoresults(noResults);
}
)