Violation of FOREIGN KEY

4 respostas
L

Estou tentando fazer uma inserção de um registro no BD Firebird mas ocorre o seguinte erro:

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544466. violation of FOREIGN KEY constraint "FK_ACESSO_SISTEMA_ADMIN" on table "ACESSO_SISTEMA"
Foreign key reference target does not exist

/******************************************************************************/
/****              Generated by IBExpert 19/01/2012 08:18:15               ****/
/******************************************************************************/



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/


CREATE GENERATOR GEN_ACESSO_SISTEMA_ID;

CREATE TABLE ACESSO_SISTEMA (
    ID_ACESSO_SISTEMA  INTEGER NOT NULL,
    DATA_ACESSO        DATE,
    ID_USUARIO_ADMIN   INTEGER,
    HORA_ENTRADA       TIME,
    HORA_SAIDA         TIME,
    ID_USUARIO_PADRAO  INTEGER
);




/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE ACESSO_SISTEMA ADD CONSTRAINT PK_ACESSO_SISTEMA PRIMARY KEY (ID_ACESSO_SISTEMA);


/******************************************************************************/
/****                             Foreign Keys                             ****/
/******************************************************************************/

ALTER TABLE ACESSO_SISTEMA ADD CONSTRAINT FK_ACESSO_SISTEMA_ADMIN FOREIGN KEY (ID_USUARIO_ADMIN) REFERENCES USUARIO_ADMIN (ID_USUARIO_ADMIN)
  USING INDEX FK_ACESSO_SISTEMA_1;
ALTER TABLE ACESSO_SISTEMA ADD CONSTRAINT FK_ACESSO_SISTEMA_PADRAO FOREIGN KEY (ID_USUARIO_PADRAO) REFERENCES USUARIO_PADRAO (ID_USUARIO_PADRAO)
  USING INDEX FK_ACESSO_SISTEMA_2;


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: ACESSO_SISTEMA_BI */
CREATE OR ALTER TRIGGER ACESSO_SISTEMA_BI FOR ACESSO_SISTEMA
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id_acesso_sistema is null) then
    new.id_acesso_sistema = gen_id(gen_acesso_sistema_id,1);
end
^


SET TERM ; ^



/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/

4 Respostas

discorpio

Bom dia Luiz.

Observe esta linha de instrução abaixo:

ALTER TABLE ACESSO_SISTEMA ADD CONSTRAINT FK_ACESSO_SISTEMA_ADMIN FOREIGN KEY (ID_USUARIO_ADMIN) REFERENCES USUARIO_ADMIN (ID_USUARIO_ADMIN)  
  USING INDEX FK_ACESSO_SISTEMA_1;

Isto significa que você criou um relacionamento entre as tabelas USUARIO_ADMIN (Tabela Primária) e ACESSO_SISTEMA (Tabela Estrangeira) onde estão ligadas pelo campo ID_USUARIO_ADMIM, criando uma Crítica (CONSTRAINT), ou seja, um recurso que bloqueia qualquer entrada de dados na tabela ACESSO_SISTEMA sem que haja qualquer usuário relacionado na tabela USUARIO_ADMIN. Em outras palavras você está tentando incluir um acesso ao sistema na tabela ACESSO_SISTEMA a um usuário inexistente na tabela USUARIO_ADMIN.

Voce tem que primeiro inserir o Usuário na tabela USUARIO_ADMIN, para depois, após pegar o seu ID_USUARIO_ADMIN e inserir na tabela ACESSO_SISTEMA.

É justamente para isto que serve os CONSTRAINTS (Críticas), ou seja, evitar que se insira nas tabelas estrangeiras, registros não relacionados com a tabela primária.

Understand. :?:

Um Abraço

L

Eu já possuo usuários cadastrados na tanto na tabela UsuarioAdmin quanto na tabela UsuarioPadrao

pmlm

Mas não aquele que estás a tentar inserir no registo de ACESSO_SISTEMA

discorpio

Olá, sou de novo.

É isso ai, verifique se o ID_USUARIO_ADMIN que você está tentando inserir em ACESSO_SISTEMA é o mesmo ID_USUARIO_ADMIN do Usuário que você quer relacionar e que está na tabela USUARIO_ADMIN. Muita das vezes, não correponde o mesmo ID, ou o ID_USUARIO_ADMIN da tabela ACESSO_SISTEMA está entrando com valor nulo.

Um abraço.

Criado 19 de janeiro de 2012
Ultima resposta 19 de jan. de 2012
Respostas 4
Participantes 3