Partager via


O2SS0028 : colonne ROWID générée (Informations)

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 :

  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. Dans une boucle, sélectionnez la ligne correspondante dans le jeu @old$0 de deleted lignes et @old$DATA les variables, en fonction de l’insertion ROWID (stockée dans @new$0 la variable) :

    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, '')))
    

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.