Partager via


DB22SS0239 : colonne ROWID non accessible (Erreur)

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 :

  1. Exécutez un curseur sur inserted le jeu de lignes, en sélectionnant et DATA en colonnes ROWID 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
    
  2. Sélectionnez la ligne correspondante dans l’ensemble de deleted lignes et @old$DATA les variables, en fonction de l’insertion ROWID (stockée dans @new$0 la variable@old$0) :

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