Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo descrive il motivo per cui SQL Server Migration Assistant (SSMA) per Oracle aggiunge ROWID
la colonna alla tabella, se sono presenti trigger.
Background
In Oracle è possibile creare un trigger che esegue FOR EACH ROW
, anziché per l'intero set di righe che sta cambiando. In SQL Server i trigger vengono sempre eseguiti per l'intero set di righe modificate. Se il trigger Oracle a livello di riga accede sia :old
:new
a variabili speciali che a variabili speciali, SSMA deve essere in grado di trovare una corrispondenza tra le righe di entrambi i set di righe per identificare il valore per una determinata riga prima e dopo l'aggiornamento. Per emulare tale funzionalità per ogni funzionalità di riga , SSMA aggiunge una colonna speciale ROWID
per identificare in modo univoco ogni riga modificata e la usa per stabilire una relazione tra inserted
i set di righe e deleted
.
Esempio
Nell'esempio seguente viene eseguito un trigger Oracle per ogni riga aggiornata nella TRIG_TEST
tabella:
CREATE OR REPLACE TRIGGER TSCHM.TRIG_TEST_AU
AFTER UPDATE OF DATA ON TSCHM.TRIG_TEST
FOR EACH ROW
BEGIN
IF (:new.DATA = 'ABC') THEN
INSERT INTO TSCHM.TRIG_TEST(DATA) VALUES ('-' || :old.DATA);
END IF;
END;
Quando si tenta di convertire questo trigger in SSMA, il T-SQL seguente viene generato all'interno del trigger di SQL Server:
Passare un cursore su un set di righe
inserted
, selezionando le colonneROWID
eDATA
in variabili@new$0
e@new$DATA
:DECLARE ForEachInsertedRowTriggerCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR SELECT ROWID, DATA FROM inserted OPEN ForEachInsertedRowTriggerCursor FETCH ForEachInsertedRowTriggerCursor INTO @new$0, @new$DATA
In un ciclo selezionare la riga corrispondente dal
deleted
set di righe in@old$0
e@old$DATA
le variabili, in base all'elemento inserito (archiviatoROWID
nella@new$0
variabile):SELECT @old$0 = ROWID, @old$DATA = DATA FROM deleted WHERE ROWID = @new$0
Eseguire azioni di trigger usando variabili
@old$DATA
/@new$DATA
:IF (@new$DATA = 'ABC') INSERT SSMAADMIN.TRIG_TEST(DATA) VALUES (('-' + ISNULL(@old$DATA, '')))
Informazioni aggiuntive
Questo comportamento è controllato dall'impostazione di progetto Genera colonna ROWID, disponibile in Strumenti>Impostazioni progetto>Generale>Conversione>Generazione ROWID. Se l'impostazione è impostata su No, ma durante la conversione del trigger SSMA identifica che richiede una ROWID
colonna, viene generato O2SS0239 errore di conversione.
Messaggi di conversione correlati
- O2SS0239: colonna ROWID non accessibile (errore)
- O2SS0267: colonna ROWID
- O2SS0404: impossibile convertire la colonna ROWID