如何在更新单独表中的列的视图上创建触发器?

Posted

技术标签:

【中文标题】如何在更新单独表中的列的视图上创建触发器?【英文标题】:How do I create a Trigger on a View that Updates a Column in a separate table? 【发布时间】:2017-01-05 19:36:20 【问题描述】:

我想知道是否可以在插入更新另一个表中的列之后在视图上创建触发器?下面是我写的一个例子。

查看名称:VMC_FWD2

表名:TLORDER

CREATE OR REPLACE TRIGGER QA_TRACE_NUM_INSERT_OI
AFTER INSERT ON VMC_FWD2
REFERENCING NEW ROW AS N
FOR EACH ROW
MODE DB2SQL 
BEGIN ATOMIC 
update tlorder set user4 = n.status where bill_number = n.number;
END

但是这会产生错误:

[IBM][CLI Driver][DB2/NT64] SQL0156N 用于此操作的名称不是表。行号=2。 SQLSTATE=42809"

还有一点研究表明,您不能在视图上使用标准触发器,并且有一种解决方法,只是不是这样。

【问题讨论】:

犹豫是否要扣动扳机,或者您是否遇到错误,或者只是无法正常工作?基于ibm.com/support/knowledgecenter/SSEPGG_11.1.0/…,我不明白为什么它不起作用,前提是对视图进行更新的用户还具有tlorder 的更新权限。 那么,你写的例子有什么问题吗? 它说“-- [IBM][CLI Driver][DB2/NT64] SQL0156N 用于此操作的名称不是表。LINE NUMBER=2。SQLSTATE=42809”等等研究表明您不能在 Views 上使用标准触发器,并表示有一种解决方法,但不是它。 视图仅支持 INSTEAD OF 触发器:CREATE TRIGGER blah INSTEAD OF INSERT ON foo... 【参考方案1】:

视图只支持INSTEAD OF 触发器,所以你的看起来像

CREATE OR REPLACE TRIGGER QA_TRACE_NUM_INSERT_OI
INSTEAD OF INSERT ON VMC_FWD2
...  -- skipped other declaration lines
BEGIN ATOMIC 
  update tlorder set user4 = n.status where bill_number = n.number;
END

【讨论】:

我是否将 ... 留在第 3 行? 不,很抱歉造成混乱。我插入省略号代替跳过的有效行,以更清楚地显示我所做的更改。基本上你只需要在你的触发文本中用INSTEAD OF替换AFTER,否则看起来没问题。 我刚刚在我们的测试服务器上运行了它,它完美插入现在我要对其进行测试,但一切看起来都很完美,非常感谢!

以上是关于如何在更新单独表中的列的视图上创建触发器?的主要内容,如果未能解决你的问题,请参考以下文章

创建一个触发器,当另一个表中的列更新时更新一个表上的列

在配置触发器时更新表中的列时出现错误

SQL 触发器更新视图中的多个列

oracle触发器在表中插入新行时更新新的视图行

当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?

如何为没有已知列的 PostgreSQL 视图编写通用更新触发器?