2010-05-19 63 views
-1

让我们考虑一个Table STUD和一个行级TRIGGER是通过INSERT查询来实现的。我的情况是这样的,无论何时插入一行,都会触发一个触发器,并且它应该访问某个放置的脚本文件在硬盘上,最终应该打印结果。那么,这是可能的吗?如果是,那么这个东西应该以动态的形式存在,即如果我们改变了脚本文件的内容,那么oracle也应该反映这些改变。Oracle触发器查询

我已经尝试过使用外部过程对java执行此操作,但是对于我想要的结果并不满意。

请给出您对这种场景的观点以及可以实施的方式。

+0

这个问题很混乱。你想从平面文件脚本中将信息添加到Oracle数据库中?这个决定的安全和设计问题让我头晕目眩。让我们知道你实际上想要做什么,而不是描述你做了什么。这可能有帮助。 – wlangstroth 2010-05-19 03:53:21

+0

那么,只要在一个表中插入一行,其中有一个ROW-Level触发器实现,那么触发器就会被触发,并且它会访问一个pl sql代码,它访问一个脚本文件(即硬盘)。 – AGeek 2010-05-19 04:07:51

+0

我们可以通过普通的INSERT查询在数据库中添加信息,但是插入后会触发一个触发器,这会执行上述可能的操作。 – AGeek 2010-05-19 04:09:11

回答

4

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

为什么使用动态代码文件的原因是愚蠢的。

  1. 插入的每一行都必须打开一个文件,读取整个内容,解析它并对结果做一些事情。这将是缓慢的。

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

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

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

  5. 文件安全性将与数据库安全性完全分离,造成维护头痛。

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

  1. 动态代码没有被解析/编译:

    原因,你不应该反正使用动态代码。所以它可能无法正常工作,直到它被执行时才会发现。

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

Misc。原因

  1. 有一个行级触发器读取和执行的代码意味着,有可能,相同的语句插入多条记录到表中可以拿起不同版本的代码来执行不同的行插入。
1

如果我想访问一个文件的sh, 这是做一些OS处理

有从数据库中执行OS的三种方式。

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

  2. 模拟host命令的Java存储过程。这是Java Runtime的手卷包装。该命令将以oracle OS用户的强大特权执行,因此不要将此过程暴露给一般用途。取而代之的是安全用户拥有它,并编写存储过程以公开特定的OS功能片段(例如执行mkdir的过程,执行ls的功能)。可能从Oracle 8i开始。 Find out more

  3. DBMS_SCHEDULER。除了后台数据库作业,我们还可以使用计划运行的OS作业。自Oracle 10g起可用。 Find out more

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

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

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