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 Db2 nécessite qu’une ROWID
colonne soit définie pour la table avec des déclencheurs.
Background
Dans Db2, 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 Db2 au niveau des lignes accède à la fois - OLD
et NEW
les noms de corrélation, 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 ces fonctionnalités « pour chaque 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 inserted
les deleted
ensembles de lignes.
Ce comportement est contrôlé par le paramètre de projet de colonne Generate ROWID, qui se trouve sous Outils>Project Settings>General>Conversion>ROWID generation. Si le paramètre est défini sur Non, la ROWID
colonne n’est pas ajoutée à la table et SSMA ne peut pas convertir de tels déclencheurs.
Exemples
Tenez compte du déclencheur Db2 suivant, qui s’exécute pour chaque ligne mise à jour dans la TRIG_TEST
table :
CREATE OR REPLACE TRIGGER TSCHM.TRIG_TEST_AU
AFTER UPDATE OF DATA ON TSCHM.TRIG_TEST
REFERENCING OLD AS O NEW AS N
FOR EACH ROW
MODE DB2SQL
BEGIN ATOMIC
IF (N.DATA = 'ABC') THEN
INSERT INTO TSCHM.TRIG_TEST(DATA) VALUES ('-' || O.DATA);
END IF;
END
Lorsque vous essayez de convertir ce déclencheur dans SSMA, si le paramètre de projet de colonne Generate ROWID est défini sur Non, SSMA génère le message d’erreur suivant :
DB22SS0239 : colonne ROWID non accessible
Solutions possibles
Modifiez le paramètre de projet Générer une colonne ROWID pour ajouter une colonne ROWID pour les tables avec des déclencheurs, ce qui permet à SSMA de produire le T-SQL suivant dans le déclencheur SQL Server lors de la conversion de l’exemple précédent :
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
Sélectionnez la ligne correspondante dans l’ensemble de
deleted
lignes et@old$DATA
les variables, en fonction de l’insertionROWID
(stockée dans@new$0
la variable@old$0
) :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, '')))
Messages de conversion connexes
- DB22SS0028 : colonne ROWID générée (Informations)
- DB22SS0267 : colonne ROWID
- DB22SS0404 : la colonne ROWID ne peut pas être convertie