Domanda

In DB2 per il sistema IBM I Creo questo trigger per la registrazione MYLOGTABLE Ogni operazione di inserimento effettuato MYCHECKEDTABLE:

SET SCHEMA MYSCHEMA;

CREATE TRIGGER MYTRIGGER AFTER INSERT ON MYCHECKEDTABLE
REFERENCING NEW AS ROWREF
FOR EACH ROW BEGIN ATOMIC
     INSERT INTO MYLOGTABLE -- after creation becomes MYSCHEMA.MYLOGTABLE
         (MMACOD, OPTYPE, OPDATE)
     VALUES (ROWREF.ID, 'I', CURRENT TIMESTAMP);
END;

Il DBMS memorizza il corpo del grilletto con MYSCHEMA.MYLOGTABLE codificata rigida.

Ora immagina di copiare l'intero schema come un nuovo schema NEWSCHEMA. Quando inserisco un record in NEWSCHEMA.MYCHECKEDTABLE Verrà aggiunto un record di registro a MYSCHEMA.MYLOGTABLE invece di NEWSCHEMA.MYLOGTABLE, cioè nello schema in cui il grilletto e il suo tavolo vivono. Questa è causa di grandi problemi !! Anche perché molti utenti possono copiare lo schema senza il mio controllo ...

Così, C'è un modo per specificare, nel corpo trigger, lo schema in cui vive il grilletto? In questo modo scriveremo il record del registro nel corretto MYLOGTABLE. Qualcosa di simile a PARENT SCHEMA... o c'è un Soluzione alternativa? Grazie molto!

È stato utile?

Soluzione 2

Sfortunatamente mi sono reso conto che lo schema in cui vive un innesco non può essere rilevato Dall'interno del corpo del trigger.

Ma ci sono alcune soluzioni alternative (grazie a @krmilligan anche):

  • Porta via l'autorità dell'utente per eseguire CPYLIB e farli usare un'utilità.
  • Crea un agente di fondo sul sistema che esegue peridioocalmente alla ricerca di trigger che non siano sincronizzati.
  • Per il comando CPYLIB Imposta il valore predefinito per TRG Opzione a *NO. In questo modo i trigger non verranno mai copiati, tranne se l'utente lo specifica esplicitamente.

Scelgo l'ultimo perché è il più semplice, anche se ci possono essere contesti in cui è richiesta una copia del trigger. In questi casi prenderei la prima soluzione alternativa.

Altri suggerimenti

I trigger esterni definiti in un HLL hanno accesso a un buffer di trigger che include il nome della libreria della tabella che ha sparato il grilletto. Questo potrebbe essere usato per qualificare il riferimento a MYLOGTABLE.

Vedere il capitolo 11.2 "Struttura del programma di innesco" di IBM RedBook Procedure memorizzate, trigger e funzioni definite dall'utente sul database universale DB2 per Iseries per maggiori informazioni.

In alternativa potresti essere in grado di utilizzare il CURRENT SCHEMA Registro speciale o il GET DESCRIPTOR Dichiarazione per scoprire dove si trovano attualmente il trigger e/o la tabella.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top