使用数据库函数填充 Maximo 字段:为什么这是一种不好的做法?
Populating a Maximo field using a db function: Why is this a bad practice?
在一个单独的 SO 问题中,我询问了如何使用数据库函数填充 Maximo 字段:
一位 Stack Overflow 社区成员非常友好地回答了这个问题并提供了以下建议:
And all that said, you should just use the automation script to do
what you have the database function doing, if at all possible. To be
more blunt, what you are wanting to do is not considered good
practice. So, make sure to include in your script's comments your
justification for not following good practice.
如果我们假设没有任何开箱即用的方法来执行我想要的操作 (),那么 为什么要从 Maximo 引用数据库函数不好的做法?
(请记住,我是 IT 行业的新手。我会从外行的术语中受益。)
我可能有点啰嗦,所以我先道歉。看起来我好像在徘徊,但我会在最后努力把它重新组合起来。
正如我在回答您的第一个问题 时所说,从自动化脚本调用存储过程(或存储函数或其他)不是 "good" 实践。这并不是说,武断地说,永远 不应该这样做,而是说,作为一项规则,应该避免这样做。当对良好实践规则进行例外处理是解决特定问题的最佳方法时,您的代码应记录您选择(或被迫)进行例外处理的原因。我支持你第一个问题的答案,它没有提到特殊情况。
如果 Maximo 中没有 out-of-the-box 配置选项来执行您想要的操作,例如交叉、关系或域等,那么您的下一个选项应该是 in-product 自定义选项(也称为作为"small 'c' customizations), if they exist. It so happens that in the case of Maximo you have "自动化脚本”或"autoscripting"在Python或Java脚本中,所有(Java)classes在JVM/服务器的class路径(可能包括 Maximo Spatial 的 Java class 方法),用于 in-product 自定义选项。使用 Maximo 76 Scripting Features 中的示例,您甚至可以弄清楚如何通过 HTTP 或 HTTPS 调用 RESTful APIs,就像 ESRI 的 ArcGIS 公开的那样。
如果in-product(小"c")定制不工作效果不够好(例如导致性能问题),那么通常可以接受,但不支持,定制产品本身(又名 "C" 定制)。 (通常可以接受,因为许多公司会接受开发大型 "C" 定制的基本原理,但不受支持,因为供应商会要求您删除您的定制并在发现问题时重现您的问题,如果它在可以想象您的自定义可能以任何方式导致问题。)在 Maximo 的情况下,编写您自己的 Java classes 或存储过程通常被认为是大的 "C" 自定义。
就 Maximo 而言,您可能会将其推广到任何 COTS 产品,从存储过程更新 Maximo 数据被认为是非常糟糕的做法。这是因为此类更新不受 Maximo 的业务规则和逻辑的约束,这可能会导致数据完整性问题、支持问题等。特别是,当 Maximo 的文档明确否认对这种顺序的承诺时,触发器通常假设 Maximo 已按特定顺序更新数据库(例如,父数据在子数据之前插入)。 (如果它不再存在,它曾经存在。)
考虑到所有这些,如果 Maximo 没有提供开箱即用的配置来执行您需要的操作,并且如果您不能使用自动脚本来执行您想要的操作,即使可以访问所有 Maximo 和Java 的库(按照优先顺序),那么使用自动化脚本调用数据库函数来计算一个值供您通过 Maximo 存储是可以接受的。事实上,在那种情况下,从您的脚本调用函数远比让触发器设置值好得多,因为假设您通过它的 API(例如 mbo.setValue("attribute","value")
)更新 Maximo,您的脚本将仍然保留审计、安全、验证、数据完整性和其他业务规则。作为奖励,您请来帮助项目的任何专业 Maximo 顾问(如我)将浪费更少的时间(读作:您的钱)来弄清楚您在做什么以及为什么他们不会破坏它。
希望对您有所帮助。
在一个单独的 SO 问题中,我询问了如何使用数据库函数填充 Maximo 字段:
一位 Stack Overflow 社区成员非常友好地回答了这个问题并提供了以下建议:
And all that said, you should just use the automation script to do what you have the database function doing, if at all possible. To be more blunt, what you are wanting to do is not considered good practice. So, make sure to include in your script's comments your justification for not following good practice.
如果我们假设没有任何开箱即用的方法来执行我想要的操作 (
(请记住,我是 IT 行业的新手。我会从外行的术语中受益。)
我可能有点啰嗦,所以我先道歉。看起来我好像在徘徊,但我会在最后努力把它重新组合起来。
正如我在回答您的第一个问题
如果 Maximo 中没有 out-of-the-box 配置选项来执行您想要的操作,例如交叉、关系或域等,那么您的下一个选项应该是 in-product 自定义选项(也称为作为"small 'c' customizations), if they exist. It so happens that in the case of Maximo you have "自动化脚本”或"autoscripting"在Python或Java脚本中,所有(Java)classes在JVM/服务器的class路径(可能包括 Maximo Spatial 的 Java class 方法),用于 in-product 自定义选项。使用 Maximo 76 Scripting Features 中的示例,您甚至可以弄清楚如何通过 HTTP 或 HTTPS 调用 RESTful APIs,就像 ESRI 的 ArcGIS 公开的那样。
如果in-product(小"c")定制不工作效果不够好(例如导致性能问题),那么通常可以接受,但不支持,定制产品本身(又名 "C" 定制)。 (通常可以接受,因为许多公司会接受开发大型 "C" 定制的基本原理,但不受支持,因为供应商会要求您删除您的定制并在发现问题时重现您的问题,如果它在可以想象您的自定义可能以任何方式导致问题。)在 Maximo 的情况下,编写您自己的 Java classes 或存储过程通常被认为是大的 "C" 自定义。
就 Maximo 而言,您可能会将其推广到任何 COTS 产品,从存储过程更新 Maximo 数据被认为是非常糟糕的做法。这是因为此类更新不受 Maximo 的业务规则和逻辑的约束,这可能会导致数据完整性问题、支持问题等。特别是,当 Maximo 的文档明确否认对这种顺序的承诺时,触发器通常假设 Maximo 已按特定顺序更新数据库(例如,父数据在子数据之前插入)。 (如果它不再存在,它曾经存在。)
考虑到所有这些,如果 Maximo 没有提供开箱即用的配置来执行您需要的操作,并且如果您不能使用自动脚本来执行您想要的操作,即使可以访问所有 Maximo 和Java 的库(按照优先顺序),那么使用自动化脚本调用数据库函数来计算一个值供您通过 Maximo 存储是可以接受的。事实上,在那种情况下,从您的脚本调用函数远比让触发器设置值好得多,因为假设您通过它的 API(例如 mbo.setValue("attribute","value")
)更新 Maximo,您的脚本将仍然保留审计、安全、验证、数据完整性和其他业务规则。作为奖励,您请来帮助项目的任何专业 Maximo 顾问(如我)将浪费更少的时间(读作:您的钱)来弄清楚您在做什么以及为什么他们不会破坏它。
希望对您有所帮助。