Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
Ejecute un cursor sobre el conjunto de filas
inserted
seleccionando las columnasROWID
yDATA
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
En un bucle, seleccione la fila coincidente de
deleted
la fila establecida en@old$0
y@old$DATA
variables, en función de la insertadaROWID
(almacenada en@new$0
variable):SELECT @old$0 = ROWID, @old$DATA = DATA FROM deleted WHERE ROWID = @new$0
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.
Mensajes de conversión relacionados
- O2SS0239: columna ROWID no accesible (error)
- O2SS0267: columna ROWID
- O2SS0404: no se puede convertir la columna ROWID