gpt4 book ai didi

sql - TRIGGERS 中的异常处理(对于每一行)

转载 作者:搜寻专家 更新时间:2023-10-30 20:51:46 24 4
gpt4 key购买 nike

当在 TRIGGER 中引发异常时会发生什么?

假设我们有一个表 R(a,b,c,d,e),其值如下:

5 rows of data in table R

现在假设我们尝试使用下面列出的有效触发器执行 UPDATE R SET b = 2, c = 3 WHERE a = 1:

CREATE TRIGGER fd_enforcer_update
BEFORE UPDATE on R
FOR EACH ROW
DECLARE counter INT
BEGIN
SELECT COUNT(*) INTO counter
FROM R
WHERE R.A = NEW.A AND R.B = NEW.B AND R.C <> NEW.C
AND NOT (R.A = OLD.A AND R.B = OLD.B AND R.C = OLD.C AND R.D = OLD.D AND R.E = OLD.E);
IF (counter > 0 )
THEN raise_exception();
END;

上面的代码据说是为了强制执行函数依赖AB->C

在上面的示例中,UPDATE 语句影响四行。由于我们在触发器中指定了 FOR EACH ROW,因此将检查这 4 行中的每一行。

触发器检查四行中的第一行 [1,1,2,3,4] 并引发异常。现在,会发生什么?触发器是否完全终止?还是继续检查其他三行?

执行完我的UPDATE语句后,实际更新了多少行?

最佳答案

对不起,我不明白。您的触发器写入有误。正确的代码如下所示:

CREATE TRIGGER fd_enforcer_update
BEFORE UPDATE on R
FOR EACH ROW
DECLARE
counter INT
BEGIN
SELECT COUNT(*)
INTO counter
FROM R
WHERE R.A = :NEW.A
AND R.B = :NEW.B
AND R.C <> :NEW.C
AND NOT (R.A = :OLD.A
AND R.B = :OLD.B
AND R.C = :OLD.C
AND R.D = :OLD.D
AND R.E = :OLD.E);
IF counter > 0 THEN
raise_exception();
END IF;
END;

如果我们调用 UPDATE R SET b = 2, c = 3 WHERE a = 1。让我们假设更新将从上到下开始:对于第一行:

a | b | c | d | e 
1 | 1 | 2 | 3 | 4

选择看起来像

    SELECT COUNT(*) 
INTO counter
FROM R
WHERE R.A = 1
AND R.B = 2
AND R.C <> 3
AND NOT (R.A = 1
AND R.B = 1
AND R.C = 2
AND R.D = 3
AND R.E = 4)

根据当前数据,它返回 4(可能是我错了,但我确定它会大于 0)。并为第一行调用 raise_exception() 触发器。并且整个事务将被回滚。

关于sql - TRIGGERS 中的异常处理(对于每一行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40238496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com