使用定制 JavaScript 验证和阻止分析查询

您可以使用 JavaScript 开发验证脚本以验证分析标准和列公式,并阻止无效查询。

阻止分析查询

使用分析的用户可以调用定制 JavaScript 来验证分析标准和列公式。通过验证功能,可以在编辑分析时阻止查询。定制 JavaScript 必须可通过 Web 服务器访问。要启用此功能,管理员需要在系统设置中指定 Web 服务器的 URL,并将该 Web 服务器注册为安全域。

  1. 使用 JavaScript 开发定制验证脚本,将其存储在 Web 服务器中,并记录包含定制脚本的 JavaScript (*.JS) 文件的 URL。
    例如,您可以开发一个阻止脚本,将其存储在 myblocking.js 中,且 URL 可能为:http://example.com:8080/mycustomscripts/myblocking.js
  2. 在系统设置中指定 Web 服务器的 URL:
    1. 依次单击控制台高级系统设置
    2. 用于阻止分析查询的 URL 中,输入在步骤 1 中记下的 URL。
  3. 将 Web 服务器注册为安全域:
    1. 依次单击控制台安全域
    2. 添加在步骤 2 中指定的 URL 中的域条目。
      例如,可能添加 example.com:8080
    3. 对于选项,选择脚本连接
  4. 测试您的验证脚本:
    1. 打开分析。
    2. 运行标准有效和无效的分析。
    3. 验证系统是否按预期阻止了查询。

开发 JavaScript 以基于标准阻止分析

每当用户尝试运行分析时,Oracle Analytics 都会调用函数 validateAnalysisCriteria。您可以定制 validateAnalysisCriteria,以便基于您自己的特定标准来验证和阻止查询。如果此函数返回 true,则查询可以运行。如果此函数返回 false 或显示一条消息,则系统会阻止查询。

例如,以下是一个名为 myblocking.js 的 JavaScript 程序的示例代码。

// This is a blocking function. It ensures that users select what 
// the designer wants them to.
function validateAnalysisCriteria(analysisXml)
{
   // Create the helper object
   var tValidator = new CriteriaValidator(analysisXml);
   // Validation Logic
   if (tValidator.getSubjectArea() != "Sample Sales")
      return "Try Sample Sales?";
   if (!tValidator.dependentColumnExists("Markets","Region","Markets","District"))
   {
      // If validation script notifies user, then return false
      alert("Region and District are well suited, do you think?");
      return false;
   }
   if (!tValidator.dependentColumnExists("Sales Measures","","Periods","Year"))
   return "You selected a measure so pick Year!";
   if (!tValidator.filterExists("Sales Measures","Dollars"))
   return "Maybe filter on Dollars?";
   if (!tValidator.dependentFilterExists("Markets","Market","Markets"))
   return "Since you are showing specific Markets, filter the markets.";
   var n = tValidator.filterCount("Markets","Region");
   if ((n <= 0) || (n > 3))
      return "Select 3 or fewer specific Regions";
   return true;
}

如果此函数返回的不是 false,则系统会认为标准有效并运行分析。此函数还可用于验证针对预览和保存操作的标准。

开发 JavaScript 以基于公式阻止分析

每当用户尝试输入或修改列公式时,Oracle Analytics 都会调用函数 validateAnalysisFormula 来验证操作。您可以定制 validateAnalysisFormula,以便基于您自己的特定标准来验证和阻止公式。如果此函数返回 true,则表示系统已接受公式。如果验证失败,则此函数会返回 false,系统拒绝公式并显示您的定制消息。

要显示一条消息并允许用户继续,函数必须返回 true。要阻止查询,函数必须返回 false 或显示一条消息。您可以在函数中使用 JavaScript 字符串和正则表达式技术,以对公式进行调查和验证。

提供了帮助函数,以便查询阻止函数可以检查筛选器、列等。请参见验证帮助函数

例如,以下代码显示了如何在用户输入不可接受的公式时阻止查询。

// This is a formula blocking function. It makes sure the user doesn't enter an unacceptable formula.
function validateAnalysisFormula(sFormula, sAggRule)
{
   // don't allow the use of concat || in our formulas
   var concatRe = /\|\|/gi;
   var nConcat = sFormula.search(concatRe);
   if (nConcat >= 0)
      return "You used concatenation (character position " + nConcat + "). That isn't allowed.";
   // no case statements
   var caseRe = /CASE.+END/gi;
   if (sFormula.search(caseRe) >= 0)
      return "Don't use a case statement.";
   // Check for a function syntax: aggrule(formula) aggrule shouldn't contain a '.'
   var castRe = /^\s*\w+\s*\(.+\)\s*$/gi;
   if (sFormula.search(castRe) >= 0)
      return "Don't use a function syntax such as RANK() or SUM().";
    return true;
}

验证帮助函数

JavaScript 文件中提供了一些验证帮助函数供您使用。

验证帮助函数 说明

CriteriaValidator.getSubjectArea()

返回分析引用的主题区域的名称。它通常在函数的 switch 语句中使用,并在运行其他验证之前执行。如果分析为基于集合的标准,则返回 null

CriteriaValidator.tableExists(sTable)

如果内容设计者已将指定文件夹(表)添加到分析中,则返回 true;如果未添加文件夹,则返回 false

CriteriaValidator.columnExists(sTable, sColumn)

如果内容设计者已将指定列添加到分析中,则返回 true;如果未添加列,则返回 false

CriteriaValidator.dependentColumnExists(sCheckTable, sCheckColumn, sDependentTable, sDependentColumn)

检查以确保当存在 checkColumn 时,也存在 dependentColumn。如果 checkColumn 不存在或者 checkColumn 和 dependentColumn 均存在,则返回 true。如果 checkColumndependentColumn 均为 null,则验证文件夹。如果 checkTable 中存在任何列,则 dependentTable 中也必须存在列。

CriteriaValidator.filterExists(sFilterTable, sFilterColumn)

如果指定列上存在筛选器,则返回 true;如果不存在筛选器,则返回 false

CriteriaValidator.dependentFilterExists(sCheckTable, sCheckColumn, sFilterTable, sFilterColumn)

检查以确保当投影列表中存在 checkColumn 时,也存在 dependentFilter。如果 checkColumn 不存在或者 checkColumn 和 dependentFilter 均存在,则返回 true

CriteriaValidator.filterCount(sFilterTable, sFilterColumn)

返回为给定逻辑列指定的筛选器值的数量。如果筛选器值为 "equals"、"null"、"notNull" 或 "in",则返回所选值的数量。如果此列未用于筛选器,则返回 0。如果提示此列没有默认值,则返回 -1。对于所有其他筛选器运算符(例如 "greater than"、"begins with" 等),返回 999,因为无法确定值的数量。