Compartilhar via


DB22SS0028: coluna ROWID gerada (informações)

Este artigo descreve o motivo pelo qual o SSMA (Assistente de Migração do SQL Server) para Db2 inclui ROWID uma coluna na tabela, se houver gatilhos.

Tela de fundo

No Db2, é possível criar um acionador que executa FOR EACH ROW, em vez de para todo o conjunto de linhas que está mudando. No SQL Server, os gatilhos sempre são executados para todo o conjunto de linhas modificadas. Se o gatilho Db2 em nível de linha acessar os OLD nomes de correlação e NEW , o SSMA precisará de uma maneira de corresponder as linhas de ambos os conjuntos de linhas, para identificar qual era o valor de uma determinada linha antes e depois da atualização. Para emular essa funcionalidade por linha, o SSMA adiciona uma coluna especial ROWID para identificar exclusivamente cada linha modificada e a usa para estabelecer uma relação entre inserted e deleted conjuntos de linhas.

Exemplos

Considere o seguinte acionador do Db2, que é executado para cada linha atualizada na TRIG_TEST tabela:

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

Quando você tenta converter esse gatilho no SSMA, o seguinte T-SQL é produzido no gatilho do SQL Server:

  1. Execute um cursor sobre o conjunto de linhas inserted, selecionando as colunas ROWID e DATA nas variáveis @new$0 e @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
    
  2. Selecione a linha correspondente ao conjunto de linhas deleted configurado nas variáveis @old$0 e @old$DATA, com base na ROWID inserida (armazenada na variável @new$0):

    SELECT @old$0 = ROWID, @old$DATA = DATA
    FROM deleted
    WHERE ROWID = @new$0
    
  3. Execute ações de gatilho usando as variáveis @old$DATA/@new$DATA:

    IF (@new$DATA = 'ABC')
        INSERT SSMAADMIN.TRIG_TEST(DATA)
        VALUES (('-' + ISNULL(@old$DATA, '')))
    

Comentários

Esse comportamento é controlado pela configuração de projeto Gerar coluna ROWID, que pode ser encontrada em Ferramentas>Configurações do Projeto>Geral>Conversão>Geração de ROWID. Se a configuração for Não, mas durante a conversão do gatilho, o SSMA identificar que requer uma ROWID coluna, DB22SS0239: o erro de conversão de coluna ROWID não acessível (Erro) será gerado.