使用 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触发器,并触发该触发器的语句,药品系统的最好,谢啦!!