Oracle SQL Developer-插入输出错误时顺序触发器仍会增加

时间:2018-12-30 14:56:55

标签: sql oracle11g triggers oracle-sqldeveloper sql-insert

我正在创建一个数据库,在此表Utilizador中,我希望codUtilizador字段(即PK)是顺序的,在插入后插入。

我是通过编辑表格创建触发器的,对触发器的编码了解不多,但是我将代码放在下面。

发生的情况是,每当一个插入输出一个错误时,它仍然会计入触发器,而下一个成功插入的触发器,其值将与假定的值不同。 (这就是我的猜测)

如果有帮助,请参见以下代码。
表格:

CREATE TABLE TipoUtilizador (
CodTipoUtilizador Number(1) Primary key 
check (CodTipoUtilizador in ('0','1')),
desc_TipoUtilizador VARCHAR2(20) not null
); 


CREATE TABLE CPostal (
CodPostal VARCHAR2(8) Primary key
check (CodPostal like '____-___'),
desc_CodPostal VARCHAR2(30) not null
);

CREATE TABLE Utilizador ( 
CodUtilizador Number(10) Primary key,
username VARCHAR2(15) Unique not null, 
password VARCHAR2(15) not null,
nCC Number(8) Unique not null,
nif Number(9) Unique not null,
nTelefone Number(9) Unique not null,
rua VARCHAR2(50) not null,
nPorta Number(3) not null,
CodPostal VARCHAR2(8) not null references CPostal(CodPostal), 
CodTipoUtilizador Number(1) not null references TipoUtilizador(CodTipoUtilizador)
);

插入:

INSERT INTO Utilizador(username, password, nCC, nif, nTelefone, rua, nPorta, CodPostal, CodTipoUtilizador)
    VALUES ('lcva2', 'lcva123', '87654321', '222222222', '999999999', 'Rua Alberto Campos', '13', '4600-102', '0');

脚本输出(我故意插入第二个错误,以便向您展示问题):

1 row inserted.


Error starting at line : 39 in command -
INSERT INTO Utilizador(username, password, nCC, nif, nTelefone, rua, nPorta, CodPostal, CodTipoUtilizador) VALUES ('lcva', 'lcva123', '12345678', '111111111', '913748456', 'Rua Alberto Campos', '13', '4600-102', '1')
Error report -
ORA-00001: unique constraint (LUIS.SYS_C007911) violated


1 row inserted.

触发:

create or replace TRIGGER UTILIZADOR_TRG 
BEFORE INSERT ON UTILIZADOR 
FOR EACH ROW 
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF INSERTING AND :NEW.CODUTILIZADOR IS NULL THEN
      SELECT UTILIZADOR_SEQ.NEXTVAL INTO :NEW.CODUTILIZADOR FROM SYS.DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;

This is how i added the trigger

结果:

On row 2, the codUtilizador field should be 2, not 3

1 个答案:

答案 0 :(得分:1)

之后触发

约束条件。before insert触发器被触发。因此,当插入失败时,序列值将更新。事务的回滚不会影响顺序。

在触发器之后执行 的原因很简单:触发器可能会更改行中的值,并且这些值需要满足约束。

这在documentation中有解释。相关部分是:

  

受SQL语句影响的每一行的循环。

     

a。运行适用于该语句的所有BEFORE行触发器。

     

b。锁定并更改行,并执行完整性约束检查。 (   提交事务之前,不会释放锁。)

     

c。运行适用于该语句的所有AFTER行触发器。

序列没有被事务锁定。当同时发生多个插入/更新时,锁定它们可能会对性能产生严重影响。