如何在触发器中检查 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】:
您可以使用 NEW
和 OLD
伪记录并运行值比较
if :NEW.COL3 <> :OLD.COL3 THEN ...
【讨论】:
不是我要找的。还是谢谢【参考方案3】:触发器对调用它们的语句一无所知,因此您必须使用某种带外信号,例如更改您的应用程序以在数据库包中设置一些全局变量,或使用应用程序上下文。
【讨论】:
以上是关于如何在触发器中检查 where 子句中给出的内容?的主要内容,如果未能解决你的问题,请参考以下文章
当您连接 2 个具有相同架构的表并检查除一个以外的所有字段是不是相等时,如何避免在 SQL 中编写冗长的 where 子句?
健全性检查:Oracle DB 的 WHERE 子句中的 (+) 运算符? [复制]