【问题标题】:Oracle - emulating a trigger on SELECTOracle - 在 SELECT 上模拟触发器
【发布时间】:2011-04-17 17:18:33
【问题描述】:

(我在想出答案的时候已经把这个问题写出来了,所以无论如何我都会发布它,因为谷歌没有给我任何有用的答案。

我希望创建类似于在 Oracle SELECT 上触发的触发器的东西。目标是根据执行 SELECT 的用户从 SELECT 的结果中删除特定行。

这需要在 Oracle 11g 的标准版(不是企业版)上工作,所以我无权访问行级安全性或细粒度审计。

我有一个现有的(非常)遗留应用程序,其中有数千个嵌入式选择,所以理想情况下我不想更改每一个...

我要处理的表中有一百万行,从性能角度来看这在一定程度上限制了我。

【问题讨论】:

  • 干得好。但是,这个问题实际上与触发器无关。您只是想控制查询的结果 - 因此最合适的解决方案是您创建的视图。

标签: oracle triggers


【解决方案1】:

由于我只是想修改 1 个特定表上的选择,因此我的答案是重命名现有表并使用原始名称创建视图。

【讨论】:

  • 然后您必须在视图上创建触发器 INSTEAD OF INSERT 和 DELETE 以保持兼容。
  • @Benoit - 不一定。仅从表中过滤掉行的简单视图通常可以在 Oracle 中更新。虽然当然可以创建一个过滤掉不可更新行的视图,在这种情况下触发器是必要的,但您可能需要对另一个表执行非键保留连接之类的操作,以使其成为问题。
  • @Justin Cave 你是对的。在我的情况下,视图非常简单 - 它看起来像 select * from emp where (<trivial condition>)。它是可更新的。
【解决方案2】:

我认为,PL SQL 块中的简单 if 条件可以解决您的问题。

【讨论】:

  • 当然。但是我正在维护一个非常大的应用程序 - 实际上是一个巨大的应用程序和几个较小的应用程序 - 并且有数百甚至数千个可以访问此表的位置。如果我将我的简单 if 条件添加到所有这些,我会在我完成之前发疯或退休:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 2016-05-31
  • 2020-08-08
  • 2014-05-08
  • 2012-03-07
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多