Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL Developer-插入输出错误时,顺序触发器仍会递增_Sql_Oracle11g_Triggers_Oracle Sqldeveloper_Sql Insert - Fatal编程技术网

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

Oracle SQL Developer-插入输出错误时,顺序触发器仍会递增,sql,oracle11g,triggers,oracle-sqldeveloper,sql-insert,Sql,Oracle11g,Triggers,Oracle Sqldeveloper,Sql Insert,我正在创建一个数据库,在这个表Utilizador中,我希望字段codUtilizador,也就是PK,是顺序的,一个接一个地插入 我通过编辑表格创建了触发器,对触发器的编码不太了解,但我将把代码放在下面 当inserts输出错误时,它仍然计数到触发器,而下一个成功插入的触发器的值与预期值不同。(我猜是这样的) 如果有帮助,下面是代码。 表: 插入: INSERT INTO Utilizador(username, password, nCC, nif, nTelefone, rua, nPor

我正在创建一个数据库,在这个表Utilizador中,我希望字段codUtilizador,也就是PK,是顺序的,一个接一个地插入

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

当inserts输出错误时,它仍然计数到触发器,而下一个成功插入的触发器的值与预期值不同。(我猜是这样的)

如果有帮助,下面是代码。
表:

插入:

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');
脚本输出(我故意插入了第二个错误,以便向您显示问题):

触发:

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;
创建或替换触发器实用程序
在UTILIZADOR上插入之前
每行
开始
开始
如果插入和:NEW.CODUTILIZADOR为空,则
选择UTILIZADOR_SEQ.NEXTVAL to:NEW.CODUTILIZADOR FROM SYS.DUAL;
如果结束;
结束列_序列;
结束;

结果:

在insert触发器触发之前的
之后检查约束。因此,插入失败时会更新序列值。事务的回滚不会影响序列

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

这一点在本节中进行了解释。有关部分是:

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

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

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

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


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

那么,如何更改我的代码以实现我的目标?@LyZ4RD。我不会的。我只会忍受这些差距。
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;