繁体   English   中英

如何避免使用触发器删除每个请求超过 1 行?

[英]How to avoid deletion of more than 1 row per request with trigger?

我想编写一个触发器拒绝每个请求删除超过 1 行

是否可以编写这样的触发器? 如果是,你能帮忙提供一个想法或代码吗?

我正在使用 oracle 数据库 11g 并在 sqldeveloper 中编写

订单

id
detail
orderdate

我不确定您为什么要这样做(多行删除比单行删除更有效),但您可以为此使用复合触发器,例如:

create table mytable (id number);

create or replace trigger one_row_per_delete
  for delete on mytable
  compound trigger

  row_count integer;

  before statement is
  begin
    row_count := 0;
  end before statement;

  before each row is
  begin
    row_count := row_count + 1;
  end before each row;

  after statement is
  begin
    if row_count > 1 then
      raise_application_error(-20000, 'Cannot delete more than one row per statement');
    end if;
  end after statement;

end one_row_per_delete;

测试:

insert into mytable values (1);

1 row inserted.

insert into mytable values (2);

1 row inserted.

insert into mytable values (3);

1 row inserted.

delete mytable where id = 1;

1 row deleted.

delete mytable;

ORA-20000: Cannot delete more than one row per statement
ORA-06512: at "SCOTT.ONE_ROW_PER_DELETE", line 18
ORA-04088: error during execution of trigger 'SCOTT.ONE_ROW_PER_DELETE'

例如,您可以使用触发器执行它

CREATE OR REPLACE TRIGGER denies_delete_trg
BEFORE DELETE
   ON table_name
DECLARE
   v_count_elements NUMBER := 0;

BEGIN
   SELECT COUNT(1) INTO v_count_elements
   FROM table_name
   WHERE contitions_of_delete;

   IF v_count_elements > 0 THEN
       RAISE_APPLICATION_ERROR (-20000,'Too rows to delete.'); 
   END IF;
END;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM