使用 when 语句创建更新触发器

Posted

技术标签:

【中文标题】使用 when 语句创建更新触发器【英文标题】:Create update trigger with when statement 【发布时间】:2015-01-19 14:52:13 【问题描述】:

我需要在 sql 上创建触发器。触发器更新值取决于新值。如果值为真,则此表的另一列为假。如果值为假,则该表的另一列为真。我尝试使用 when 或 if 语句,但出现错误。有人可以帮我解决这个问题。

这是我的代码:

CREATE TRIGGER pUSer_update
AFTER UPDATE ON pUser
   REFERENCING OLD ROW AS Old, NEW ROW AS New FOR EACH ROW
     when(New.DELETED=1 AND New.ACTIVE=1)then
        UPDATE pUser SET ACTIVE = 0
     when (New.DELETED=0 AND New.ACTIVE=0)then
         UPDATE pUser SET ACTIVE = 1
         ;

【问题讨论】:

witch DBMS 你在用 MSSQL 吗? 哪些 dmbs? (该语法看起来不像 ANSI SQL。) MSSQL 如下所示:***.com/questions/18375681/… 如果这是 SQl 服务器,不要逐行处理。完全没有理由不进行基于集合的操作。 “得到错误”对我们没有帮助 - 你得到了什么错误,具体来说?信息是什么?是否包含任何其他信息? 【参考方案1】:

由于语法原因,我假设您使用的是 Oracle。我还假设您想在用户未删除时将其设置为“活动”,而在他被删除时将其设置为“非活动”。因此,我们将检查pUser 中的deleted 列何时更新,并据此切换active。而且我认为您需要一个BEFORE 触发器,而不是AFTER 触发器。

CREATE TRIGGER pUSer_update
BEFORE UPDATE OF deleted ON pUser
FOR EACH ROW
BEGIN
  SELECT 1 - new.deleted
    INTO :new.active
    FROM dual;
END;
/

您可能需要在 SELECT 中使用冒号 (:new.deleted) 引用 new.deleted(我不记得是哪个)。

【讨论】:

直接赋值 :new.active := ...select .. into .. 真的!不过,我认为这是在 Oracle 11g(可能是 10g)中首次引入的,并且 OP 没有指定 DBMS。

以上是关于使用 when 语句创建更新触发器的主要内容,如果未能解决你的问题,请参考以下文章

求创建一个update触发器,并触发该触发器的语句,药品系统的最好,谢啦!!

无法使用“WHEN”创建触发器

oracle_触发器

MYSQL 更新触发器 - 无法更新存储函数/触发器中的表,因为它已被语句使用

如何创建触发器以检查更新的字段值

Oracle触发器使用case语句创建