【问题标题】:Replacing trigger with a procedure用过程替换触发器
【发布时间】:2019-08-14 07:54:51
【问题描述】:

我有一个表 t1,其中包含字段 id、名称和日期。当我将日期更新为某个值时,我想将该条目移动到另一个表 t2(在 t1 中将其删除并将其插入到 t2 中)。 我明确希望对 UPDATE 操作而不是 DELETE 操作执行此操作。

我尝试使用 AFTER UPDATE ON t1 触发器来执行此操作,但是,我发现我无法在 t1 的触发器中从 t1 中删除条目。

这是否意味着我需要通过程序执行此操作?如果是,每次我将日期字段更新为 t1 中的某个值时,如何运行程序?

【问题讨论】:

  • " 每次我将日期字段更新为 t1 中的某个值时,如何运行程序"。你不能。您可以做的是在T1 上构建一个 API,这将允许您执行此操作,并从每个人撤消 UPDATE (INSERT, DELETE),迫使他们改为调用您的 API。当然,此选项仅适用于根植于 PL/SQL 逻辑的强大设计原则的应用程序。因此,它可能不是适合您的解决方案(仅统计,在极少数应用程序具有强大的 PL/SQL 设计文化之前)。

标签: sql oracle sql-update procedure database-trigger


【解决方案1】:

为表 t1 创建一个视图,然后在该视图上创建一个 INSTEAD OF TRIGGER:

create view v1 as select * from t1;

CREATE OR REPLACE TRIGGER IO_V1
    INSTEAD OF UPDATE ON V1
    FOR EACH ROW
BEGIN
    INSERT INTO t2 ...;
END;

当然,您可以将所有内容封装在一个过程中并运行该过程,而不是直接执行 UPDATE 语句。

【讨论】:

  • 你的意思是,如果我在视图上创建触发器,它将在我在 t1 上进行更新时触发,并且从那个触发器我可以改变 t1 吗?
  • 不,触发器只会在视图 v1 更新时触发。如果您使用这种方法,则应从用户撤销表 t1 上的 UPDATE 权限。
  • 好吧,这听起来不像我想要的。您的另一个建议,封装在一个过程中,是否可以使用触发器之类的过程?这意味着每次我发表更新声明时都会调用它?
  • 不,如果你使用一个过程,那么在 t1 上直接更新也是不可能的。
猜你喜欢
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多