簡體   English   中英

Oracle SQL Developer-插入輸出錯誤時順序觸發器仍會增加

[英]Oracle SQL Developer - Sequential trigger still increments when inserts output error

我正在創建一個數據庫,在此表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;

這就是我添加觸發器的方式

結果:

在第2行,codUtilizador字段應為2,而不是3

在檢查約束之后 before insert觸發觸發器。 因此,當插入失敗時,序列值將更新。 事務的回滾不會影響順序。

在觸發器之后進行檢查的原因很簡單:觸發器可能會更改行中的值,並且這些值需要滿足約束。

文檔中對此進行了說明 相關部分是:

為受SQL語句影響的每一行循環。

一種。 運行適用於該語句的所有BEFORE行觸發器。

鎖定並更改行,並執行完整性約束檢查。 (在提交事務之前,不會釋放該鎖。)

C。 運行適用於該語句的所有AFTER行觸發器。

序列沒有被事務鎖定。 當同時發生多個插入/更新時,鎖定它們可能會對性能產生嚴重影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM