如何在触发器中检查 where 子句中给出的内容?

Posted

技术标签:

【中文标题】如何在触发器中检查 where 子句中给出的内容?【英文标题】:How to check in Trigger what has been given in the where clause? 【发布时间】:2013-10-25 08:58:51 【问题描述】:

我正在编写一个INSTEAD OF UPDATE 触发器,我想确定哪些列被赋予了触发触发器的 UPDATE 语句的 WHERE 子句。

例如,

假设我们有下表

table_name
--COL1
--COL2
--COL3
--COL4

我想要,当执行更新时 例如UPDATE table_name SET COL1=VAL1,COL2=VAL2 WHERE COL3=VAL3

能够在我的触发器中说出来

CREATE or replace TRIGGER DEVICES_VIEW_TR 
  INSTEAD OF UPDATE ON DEVICES_VW
  BEGIN
    IF (COL3 has been given in the where clause) THEN
      variable=getValueOf(COL3);
    ELSEIF (COL4 has been given in the where clause) THEN 
      variable=getValueOf(COL4);
    END IF;
  END;
/

这个可以吗?

谢谢

【问题讨论】:

看起来不太好。而不是更改 set 子句中提到的 col1 和 col2 ,而是要更改 where 子句中提到的 col3 ?那会很混乱。总之,触发器不能告诉你触发语句,因此没有机会知道 where 子句。 @ThorstenKettner 我不想更改 where 子句中提到的 COL3 的值。我只想知道触发触发器的更新语句在 where 子句中是否包含 COL3 或 COL4。这样做的原因是因为我想执行 where 子句只包含一个主键列而不是一个将更新多个记录的列的更新。我希望现在很清楚。 好的,所以你的例子有点混乱。正如我所说,触发器不会告诉您触发语句。因此,您无法判断 col3 或 col4 是否在 where 子句中。您唯一的选择是检测影响多行的更新并抛出异常以防万一。即使这也不容易做到,因为触发器中也没有关于受影响行数的信息。在此处查找确定受影响行数的方法:***.com/questions/8770386/… 我编辑了我的问题以便更清楚。谢谢(你的)信息。我会看看你的建议。 你在用variable做什么? 【参考方案1】:

您可以在触发器中使用UPDATING('column name')

-- in INSTEAD OF trigger body:
IF updating('COL1') THEN
  -- some operation
END IF;

查看示例:Example of using UPDATING

【讨论】:

我已经知道了,但这只是在检查 UPDATE 的 SET 部分中传递的内容,对吗?所以这不是我要找的 @NikosDim 等等,您想获取WHERE 子句中哪些列的信息?我认为这是不可能的。很抱歉,我没有从您的描述中理解您的意图。【参考方案2】:

您可以使用 NEWOLD 伪记录并运行值比较

if :NEW.COL3 <> :OLD.COL3 THEN ...

【讨论】:

不是我要找的。还是谢谢【参考方案3】:

触发器对调用它们的语句一无所知,因此您必须使用某种带外信号,例如更改您的应用程序以在数据库包中设置一些全局变量,或使用应用程序上下文。

【讨论】:

以上是关于如何在触发器中检查 where 子句中给出的内容?的主要内容,如果未能解决你的问题,请参考以下文章

当您连接 2 个具有相同架构的表并检查除一个以外的所有字段是不是相等时,如何避免在 SQL 中编写冗长的 where 子句?

健全性检查:Oracle DB 的 WHERE 子句中的 (+) 运算符? [复制]

使用 Where 子句在 MySql 中创建触发器

WHERE子句中的SQL Server CASE表达式以检查NULL值

如何在oracle的where子句中使用特殊字符'_'

如何仅使用在不使用动态SQL的情况下检查的复选框,将WHERE子句设置为在多个位列上进行过滤?