【问题标题】:Oracle Trigger Update with Where Clause带有 Where 子句的 Oracle 触发器更新
【发布时间】:2016-08-25 11:14:07
【问题描述】:

假设我有这样的事情:

UPDATE my_table set col2 = '5' where col1 = '111';
UPDATE my_table set col2 = '5' where col3 = '112';

现在我做了一个更新前触发器,我想知道 UPDATE 语句中使用的列(即 col1、col3)。换句话说,我可以看到触发器中使用的确切更新语句吗?这可能吗?

谢谢!

【问题讨论】:

  • 不清楚您要达到的目标。触发器有什么作用?上面的更新是否在触发器内?
  • 您想知道列字段还是分配给列的值?对于第二种情况,使用 :NEW 和 :OLD 指针可以获得更新前和更新后的值。但我认为您不能在触发器中动态获取列名。
  • @Rolson 我知道..我简短地说我想要做什么:我必须创建一个日志表,其中包含 my_table 上的更新(类似于指定操作的时间戳,在我的情况下更新) 然后我必须将旧版本的表更新为当前版本。清楚了吗?
  • 好的。这个链接对techonthenet.com/oracle/triggers/before_update.php有帮助吗?

标签: sql oracle plsql


【解决方案1】:

不,你不能。触发器不知道是什么语句导致了它的执行。

【讨论】:

  • 好的,如果你知道的话,当然可以告诉我一些事情。我必须制作一个日志表(两列,一列带有日期和时间,另一列带有操作,例如我的更新)。在我创建了这个日志表之后,我必须将旧版本的 my_table 更新为当前版本(换句话说,要确切地知道进行了哪些更新),当然是按时间顺序(这很简单)。困难的部分是应用更改,前提是我的触发器无法知道应用了哪个更新。
  • 触发器知道进行了哪个更新,因为它具有伪记录 newold,您可以在其中看到所做的更改(old.colx 不等于 new.colx)和记录也是主要的,因为这也在那些记录中。它只是不知道哪个确切的声明导致了更新,但为什么要这样做呢?你会从这些信息中得到什么?触发器对每一行都执行,因此UPDATE my_table set col2 = '5' where col1 = '111' 可能会更新三行,触发器将被调用三次。因此,您也可以使用三个主键编写三个更新。
  • 好的,但是我必须在日志表的第二列中写入什么信息?制作完这张表后,我必须更新我的旧版本。我不明白。
  • 好吧,假设 my_table 有这些列:id、col1、col2。通常 ID 永远不会更改,因此您需要一个具有相同列的日志表。让我们进一步说,上面的更新语句影响了两条记录,一条 id=9、col1=111 和 col2=99,一条 id=21、col1=111、col2=88。执行该语句后,您的日志表中有两条记录:一条 id=9、col1=111 和 col2=5,一条 id=21、col1=111、col2=5。稍后您可以创建两个更新语句:update old_table set col1 = 111, col2 = 5 where id = 9update old_table set col1 = 111, col2 = 5 where id = 21
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 2012-10-26
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
相关资源
最近更新 更多