Trigger su tupla

di il
1 risposte

Trigger su tupla

Salve, sto finendo un progetto per l'università dove si deve interrogare un database in java. Ho il problema di dover aggiornare una tupla che ha come una foreign key come vincolo ad un'altra tupla di un'altra tabella. Quando voglio aggiornare la tupla referenziata esce come errore:

ERRORE: java.sql.SQLIntegrityConstraintViolationException: ORA-02291: restrizione di integrità violata (SYSTEM.ENT_REL_FK) - chiave madre non trovata

Il mio obbiettivo sarebbe quello di aggiornare sia la tupla referenziata che quella che referenzia. Ho provato ad usare trigger prima e dopo l'aggiornamento ma il vincolo m'impedisce qualsiasi aggiornamento, ho anche provato di cancellare la tupla che referenzia prima che venga aggiornata la prima tabella (la referenziata) ma nulla.

1 Risposte

  • Re: Trigger su tupla

    Se ho capito bene :
    -- Create table
    create table TABELLA_A
    (
    CODICE_A VARCHAR2(30) not null,
    DESCRIZIONE VARCHAR2(100)
    )
    /
    -- Create/Recreate primary, unique and foreign key constraints
    alter table TABELLA_A
    add constraint TABELLA_A_PK primary key (CODICE_A)
    using index
    /
    -- Create table
    create table TABELLA_B
    (
    CODICE_B VARCHAR2(30) not null,
    DESCRIZIONE VARCHAR2(100),
    CODICE_A VARCHAR2(30)
    )
    /
    -- Create/Recreate primary, unique and foreign key constraints
    alter table TABELLA_B
    add constraint TABELLA_B_PK primary key (CODICE_B)
    using index
    /
    alter table TABELLA_B
    add constraint TABELLA_B_FK_TABELLA_A foreign key (CODICE_A)
    references TABELLA_A (CODICE_A)
    /

    Se voglio inserire in TABELLA_B anche se il codice A non esiste
    Trigger
    CREATE OR REPLACE TRIGGER T_TABELLA_B_INS
    BEFORE INSERT ON TABELLA_B
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    DECLARE
    BEGIN
    if :new.codice_a is not null then
    insert into tabella_a (codice_a,descrizione)
    select :new.codice_a,'Descrizione '||:new.codice_a
    from dual
    where not exists (select 1
    from tabella_a
    where codice_a = :new.codice_a
    );
    end if;
    END T_TABELLA_B_INS;

    In questo modo qualsiasi riga che si inserira' in tabella b con referenza a tabella a si autoalimetera'
Devi accedere o registrarti per scrivere nel forum
1 risposte