Compartir a través de


O2SS0028: columna ROWID generada (Información)

En este artículo se describe el motivo por el que SQL Server Migration Assistant (SSMA) para Oracle agrega ROWID columna a la tabla, si hay desencadenadores.

Fondo

En Oracle, puede crear un desencadenador que ejecute FOR EACH ROW, en lugar de para todo el conjunto de filas que está cambiando. En SQL Server, los desencadenadores siempre se ejecutan para todo el conjunto de filas modificadas. Si el desencadenador de Oracle de nivel de fila accede a variables :old especiales y :new , SSMA necesita una manera de hacer coincidir las filas de ambos conjuntos de filas para identificar cuál era el valor de una fila determinada antes y después de la actualización. Para emular tal para cada funcionalidad de fila , SSMA agrega una columna especial ROWID para identificar de forma única cada fila modificada y la usa para establecer una relación entre inserted los conjuntos de filas y deleted .

Ejemplo

En el ejemplo siguiente, un desencadenador de Oracle se ejecuta para cada fila actualizada en TRIG_TEST la tabla:

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;

Al intentar convertir este desencadenador en SSMA, se genera el siguiente T-SQL en el desencadenador de SQL Server:

  1. Ejecute un cursor sobre el conjunto de filas inserted seleccionando las columnas ROWID y DATA en las variables @new$0 y @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. En un bucle, seleccione la fila coincidente de deleted la fila establecida en @old$0 y @old$DATA variables, en función de la insertada ROWID (almacenada en @new$0 variable):

    SELECT @old$0 = ROWID, @old$DATA = DATA
    FROM deleted
    WHERE ROWID = @new$0
    
  3. Realice acciones de desencadenador mediante las variables @old$DATA/@new$DATA:

    IF (@new$DATA = 'ABC')
        INSERT SSMAADMIN.TRIG_TEST(DATA)
        VALUES (('-' + ISNULL(@old$DATA, '')))
    

Información adicional

Este comportamiento se controla mediante la configuración del proyecto Generar columna ROWID, que se puede encontrar en Herramientas>Configuración de proyecto>General>Conversión>Generación de ROWID. Si la configuración se establece en No, pero durante la conversión del desencadenador SSMA identifica que requiere una ROWID columna, se genera O2SS0239 error de conversión.