Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
Execute um cursor sobre o conjunto de linhas
inserted
, selecionando as colunasROWID
eDATA
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
Selecione a linha correspondente ao conjunto de linhas
deleted
configurado nas variáveis@old$0
e@old$DATA
, com base naROWID
inserida (armazenada na variável@new$0
):SELECT @old$0 = ROWID, @old$DATA = DATA FROM deleted WHERE ROWID = @new$0
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.
Mensagens de conversão relacionadas
- DB22SS0239: Coluna ROWID não acessível (Erro)
- DB22SS0267: coluna ROWID
- DB22SS0404: a coluna ROWID não pode ser convertida