Condividi tramite


O2SS0028: colonna ROWID generata (Info)

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:

  1. Passare un cursore su un set di righe inserted, selezionando le colonne ROWID e DATA 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
    
  2. 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 (archiviato ROWID nella @new$0 variabile):

    SELECT @old$0 = ROWID, @old$DATA = DATA
    FROM deleted
    WHERE ROWID = @new$0
    
  3. 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.