如何在oracle中删除触发器之前删除行数
how to get deleting rows count in before delete trigger in oracle
我打算在 oracle 中创建一个删除前触发器,我需要知道有多少记录将被删除,如果删除行的数量超过阈值(也许取消删除)
问题是如何得到删除的行数来进行检查?
感谢您的帮助
一个删除语句可以影响很多行。您可以在四个事件上放置触发器:
- before statement 你所知道的是将要进行 0 到 n 次删除
- 在每一行之前,您只看到一行即将被删除
- 在每一行之后 你只再次看到那一行
- 语句后 你只知道发生了 0 到 n 次删除
因此,仅 none 这些触发器类型就可以帮助您完成任务。您想要的是一个复合触发器,您可以在其中计算 before 或 after each row 部分中受影响的行,并查看总数声明 部分之后。
CREATE OR REPLACE TRIGGER trg_check_max_deletes
FOR DELETE ON mytable COMPOUND TRIGGER
v_count INTEGER := 0;
AFTER EACH ROW IS
BEGIN
v_count := v_count + 1;
END AFTER EACH ROW;
AFTER STATEMENT IS
BEGIN
IF v_count > 3 THEN
RAISE_APPLICATION_ERROR(-20000, 'You are not allowed to delete more than 3 rows at once.');
END IF;
END AFTER STATEMENT;
END trg_check_max_deletes;
演示:https://dbfiddle.uk/?rdbms=oracle_21&fiddle=ba801c67c9e63eadaff1f233debacc00
我打算在 oracle 中创建一个删除前触发器,我需要知道有多少记录将被删除,如果删除行的数量超过阈值(也许取消删除)
问题是如何得到删除的行数来进行检查?
感谢您的帮助
一个删除语句可以影响很多行。您可以在四个事件上放置触发器:
- before statement 你所知道的是将要进行 0 到 n 次删除
- 在每一行之前,您只看到一行即将被删除
- 在每一行之后 你只再次看到那一行
- 语句后 你只知道发生了 0 到 n 次删除
因此,仅 none 这些触发器类型就可以帮助您完成任务。您想要的是一个复合触发器,您可以在其中计算 before 或 after each row 部分中受影响的行,并查看总数声明 部分之后。
CREATE OR REPLACE TRIGGER trg_check_max_deletes
FOR DELETE ON mytable COMPOUND TRIGGER
v_count INTEGER := 0;
AFTER EACH ROW IS
BEGIN
v_count := v_count + 1;
END AFTER EACH ROW;
AFTER STATEMENT IS
BEGIN
IF v_count > 3 THEN
RAISE_APPLICATION_ERROR(-20000, 'You are not allowed to delete more than 3 rows at once.');
END IF;
END AFTER STATEMENT;
END trg_check_max_deletes;
演示:https://dbfiddle.uk/?rdbms=oracle_21&fiddle=ba801c67c9e63eadaff1f233debacc00