如何创建只更新一行的触发器

Posted

技术标签:

【中文标题】如何创建只更新一行的触发器【英文标题】:How to create a trigger that only updates one row 【发布时间】:2016-12-09 14:27:07 【问题描述】:

我研究了我的问题,但仍然不知道语法是什么。这个没有回答:Trigger that updates just the inserted row

使用Oracle SQL Developer,在这张Employees表中,假设ID是主键,那么如何创建触发器来更新第二条记录,将Alice的区域更改为“West”?

到目前为止,我有:

CREATE OR REPLACE TRIGGER employees_trg on employees
WHERE ID = 2
FOR INSERT
AS
    UPDATE dbo.employees
    ....

【问题讨论】:

您的问题的答案是许多数据库不允许触发器在调用触发器的同一个表上触发。因此,您可能需要找到一种解决方法,例如存储过程。顺便问一下,你用的是什么数据库? 您使用的是什么 DBMS?从你的问题看不太清楚,但答案取决于它。 我编辑了我的问题以提及 Oracle SQL Developer。谢谢。 链接的问题是针对 SQL Server 的,它对触发器有一个完全不同的概念(其中之一:它没有行级触发器) a_horse_with_no_name 谢谢 【参考方案1】:

我的理解是,当有人使用 Id = 2 更新行时,您想强制该区域为西部。你可以这样做:

CREATE OR REPLACE TRIGGER employees_trg 
  BEFORE UPDATE on employees FOR EACH ROW
begin
if (:new.id = 2) then
  :new.region := 'West';
end if;
end;
/

【讨论】:

但他要求更新它,。你上面的例子 if 和 update add 将导致Mutating error @Moudiz 你为什么这么认为?同意 Kacper 使用 BEFORE INSERT 而不是 BEFORE UPDATE 但修复它不会导致变异表错误。 好的,我修复了它以更新你是对的。没有变异错误,因为我没有插入只是覆盖新值。 @Moudiz

以上是关于如何创建只更新一行的触发器的主要内容,如果未能解决你的问题,请参考以下文章

更新后触发,错误:标量子查询只允许返回单行

postgresql无法创建触发器

如何在 SQL 中使用触发器来更新一行,基于另外两行

子查询返回超过 1 个值 - 我的触发器无法处理多个行更新

我想在同一张表上创建更多触发器

oracle如何创建行级触发器?