Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article décrit la raison pour laquelle Assistant Migration SQL Server (SSMA) pour Oracle ajoute ROWID
une colonne à la table, s’il existe des déclencheurs.
Background
Dans Oracle, vous pouvez créer un déclencheur qui s’exécute FOR EACH ROW
, plutôt que pour l’ensemble entier des lignes qui changent. Dans SQL Server, les déclencheurs s’exécutent toujours pour l’ensemble des lignes modifiées. Si le déclencheur Oracle au niveau des lignes accède à la fois - :old
et :new
des variables spéciales, SSMA a besoin d’un moyen de faire correspondre les lignes des deux ensembles de lignes afin d’identifier la valeur d’une ligne donnée avant et après la mise à jour. Pour émuler ce type pour chaque fonctionnalité de ligne, SSMA ajoute une colonne spéciale ROWID
pour identifier de manière unique chaque ligne modifiée et l’utilise pour établir une relation entre les deleted
ensembles de lignes et les inserted
ensembles de lignes.
Exemple
Dans l’exemple suivant, un déclencheur Oracle s’exécute pour chaque ligne mise à jour dans TRIG_TEST
la table :
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;
Lorsque vous essayez de convertir ce déclencheur dans SSMA, le T-SQL suivant est produit dans le déclencheur SQL Server :
Exécutez un curseur sur
inserted
le jeu de lignes, en sélectionnant etDATA
en colonnesROWID
dans et@new$DATA
variables@new$0
:DECLARE ForEachInsertedRowTriggerCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR SELECT ROWID, DATA FROM inserted OPEN ForEachInsertedRowTriggerCursor FETCH ForEachInsertedRowTriggerCursor INTO @new$0, @new$DATA
Dans une boucle, sélectionnez la ligne correspondante dans le jeu
@old$0
dedeleted
lignes et@old$DATA
les variables, en fonction de l’insertionROWID
(stockée dans@new$0
la variable) :SELECT @old$0 = ROWID, @old$DATA = DATA FROM deleted WHERE ROWID = @new$0
Effectuez des actions de déclencheur à l’aide de
@old$DATA
/@new$DATA
variables :IF (@new$DATA = 'ABC') INSERT SSMAADMIN.TRIG_TEST(DATA) VALUES (('-' + ISNULL(@old$DATA, '')))
Informations supplémentaires
Ce comportement est contrôlé par le paramètre de projet de colonne Generate ROWID, qui se trouve sous Tools>Project Paramètres> General>Conversion>ROWID génération. Si le paramètre est défini sur Non, mais pendant la conversion du déclencheur SSMA identifie qu’il nécessite une ROWID
colonne, O2SS0239 erreur de conversion est générée.
Messages de conversion connexes
- O2SS0239 : colonne ROWID non accessible (Erreur)
- O2SS0267 : colonne ROWID
- O2SS0404 : la colonne ROWID ne peut pas être convertie