【问题标题】:Oracle Triggers QueryOracle 触发器查询
【发布时间】:2010-05-20 07:50:43
【问题描述】:

让我们考虑一个 Table STUD 和一个 ROW-Level TRIGGER 是通过 INSERT 查询实现的。我的场景是这样的,每当插入一行时,就会触发一个触发器,它应该访问一些放在硬文件中的脚本文件磁盘,最终应该打印结果。那么,这件事可能吗?如果是,那么这个东西应该以动态形式存在,即如果我们改变脚本文件的内容,那么预言机也应该反映这些变化。

我曾尝试使用外部过程为 java 执行此操作,但对我想要的结果不太满意。

请给出您对这种情况的看法以及可以实施的方式。

【问题讨论】:

  • 这个问题真的很混乱。您想从平面文件脚本向 Oracle 数据库添加信息吗?该决定的安全性和设计问题让我头晕目眩。让我们知道您实际上想要做什么,而不是描述您所做的事情。这可能会有所帮助。
  • 好吧,每当在表中插入一行时,该表实现了 ROW 级触发器,然后触发触发器并访问 pl sql 代码,该代码访问外部脚本文件(即从硬盘)..
  • 我们可以通过正常的INSERT查询在数据库中添加信息,但是插入后会触发一个触发器,它会执行上述可能的操作..
  • @JeffreyKemp - 由于 Gary 和我都削弱并提供了答案,我建议我们投票结束另一个问题而不是这个问题。

标签: oracle triggers external-process


【解决方案1】:

社区 wiki 说明为什么这是一个坏主意。

为什么将文件用于动态代码是愚蠢的。

  1. 插入的每一行都必须打开一个文件,读取全部内容,解析它并用结果“做点什么”。那会很慢。

  2. 根据操作系统环境,您可能无法同时打开文件进行读写。因此,您可能会发现您必须关闭数据库才能将代码更改“提升”到文件中。

  3. 根据操作系统环境,您甚至可能会发现一次只能读取一个会话。

  4. 也许触发器会在“保存”过程中读取文件并执行部分代码。

  5. 文件安全性将与数据库安全性完全分开,造成维护上的麻烦。

简而言之,将动态代码存储在表中而不是文件中将是一项巨大的改进。

无论如何都不应该使用动态代码的原因:

  1. 动态代码尚未被解析/编译。所以它可能不起作用,直到它被执行你才发现。

  2. 由于减少了解析开销,静态代码的性能优于动态代码。

杂项。原因

  1. 让行级触发器读取并执行代码意味着,将多条记录插入表中的同一语句可能会选择不同版本的代码来执行不同的行插入。

【讨论】:

    【解决方案2】:

    如果我想访问一个 sh 文件怎么办, 正在做一些操作系统处理

    从数据库内部执行操作系统的三种方式。

    1. 外部过程,它们是用 C 或 Java 编写的 OS 库的 PL/SQL 包装器。从 Oracle 8.0 开始可用。 Find out more

    2. 模拟host 命令的Java 存储过程。这是 Java Runtime 的手动包装器。此命令将以oracle OS 用户的强大权限执行,因此不要公开此过程以供一般使用。而是让一个安全的用户拥有它,并编写存储过程来公开特定的操作系统功能(例如,一个执行mkdir的过程,一个执行ls的函数)。自 Oracle 8i 以来可能。 Find out more

    3. DBMS_SCHEDULER。除了后台数据库作业,我们还可以使用计划运行的操作系统作业。从 Oracle 10g 开始可用。 Find out more

    在这三个选项中,DBMS_SCHEDULER 可能是最安全的选项。顾名思义,它旨在定时运行程序(如 unix cron),因此它不适合按需运行(例如通过触发器)。但是,可能不需要触发器就可以满足您的业务逻辑。外部过程不适用于运行 shell 脚本。

    外部程序是外部的,需要更多的努力来与数据库组件进行协调。这适用于发布应用程序的新版本和进行备份时。当(比如说)开发环境和实时环境在不同的平台上时,它们也可能很麻烦。

    让数据库执行任意代码是一个非常糟糕的主意。在大多数情况下,所需要的只是一种将参数传递给可执行文件的机制。

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多