PROBLEMA: Avisos ANSI podem incorrectamente Mostrar agentes de replicação como falhou

Artigo: 304535 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sintomas

O Monitor de replicação indica que um agente falhou se o processo de replicação encontrar ANSI_WARNINGS. A mensagem que informa o agente está dependente do aviso de ANSI que ocorre; por conseguinte, a mensagem de erro varia. Se ocorrer uma mensagem de erro, poderá achar que dados realmente sincronizou com êxito. Este comportamento pode ocorrer se:
  • Um accionador de inserção está definido numa tabela que faz parte de uma publicação de impressão em série. Quando executa o accionador, a seguinte mensagem de aviso ocorre:
    Aviso 8153: valor nulo é eliminado por uma operação SET agregação ou outra.
  • O serviço de impressão em série falhar enquanto os dados intercalar e sincronizar correctamente.

Causa

Todos os agentes de replicação estão definidos como tarefas de agente do SQL Server. Por predefinição, SQL Server Agent tarefas devolvem um estado de falha se se encontrar uma mensagem de erro ou um aviso. Por este motivo, agentes de replicação Mostrar um estado de falha se detectar um aviso de ANSI.

Como contornar

Para contornar este comportamento, utilize um dos seguintes métodos:
  • Investigue e evitar uma situação em que poderá ocorrer um aviso de ANSI.
  • Definir ANSI_WARNINGS para OFF no accionador ou encontrar uma forma para definir ANSI_WARNINGS para desactivar o cliente que invoca o accionador.
SQL Server 2000 e versões anteriores do SQL Server não tem uma opção que permite-lhe definir avisos ANSI OFF para os agentes de replicação (ou seja, o agente de Snapshot, serviço de distribuição e agente de intercalação). Por conseguinte, a única forma outra que ao eliminar a causa do aviso é suprimir o aviso. Para suprimir o aviso, adicione uma instrução SET ANSI_WARNINGS OFF na definição de accionador. Note que poderá causar resultados inesperados suprimir o aviso. Por conseguinte, terá de exaustivamente investigar possíveis resultados antes de definir ANSI_WARNINGS para desactivar.

Mais Informação

Se ANSI_WARNINGS estiver definida para VERDADEIRO, erro ou ocorrem mensagens de aviso para condições como um erro de "dividir por zero" ou se nulo valores aparecem no funções de agregação. Se ANSI_WARNINGS estiver definido como false, nenhum avisos ocorrem. Condições como "dividir por zero" ou valores nulos aparecem em funções de agregação não irão devolver um aviso. Por predefinição, ANSI_WARNINGS está definido como false.

Definições de nível de sessão (definidas utilizando a instrução SET) substituem a definição de base de dados predefinido para avisos ANSI. Por predefinição, quando os clientes ODBC e OLE DB ligam ao SQL Server, emitem uma instrução SET que define avisos ANSI como true para a sessão actual. Consulte o tópico "SET" no SQL Server Books Online para obter mais informações sobre o processamento de nível de sessão actual de informações específicas.

Exemplo do problema e como como contornar o problema

Para reproduzir o problema, utilize estes passos:
  1. Utilizar este código e criar uma tabela num editor:
    CREATE TABLE [dbo].[test_warning] ( 	[int1] [int] NULL , )  
    --insert null values into the table using  
    insert into test_warning values (NULL)  
    					
  2. Defina o accionador seguinte na tabela criada no passo 1. Como pode ver, o accionador não faz nada mas executa uma função aritmética num valor nulo:
    CREATE TRIGGER test_warning_insert ON dbo.test_warning
    FOR INSERT AS
    declare @i int
    set @i = (select min(int1) from test_warning)
    					
  3. Crie uma publicação de impressão em série na tabela.
  4. Crie uma subscrição para a publicação criada no passo 3.
  5. A partir do subscritor, execute a seguinte instrução para inserir valores numa tabela subscritor:
    insert into test_warning values (1, newid())
    						
  6. Quando o serviço de impressão em série é iniciada a sincronização, mostra a seguinte mensagem de erro e aviso detalhado para indicar um processo de intercalação falhou:
    O processo não conseguiu entregar inserções no subscritor
    Aviso: O valor nulo é eliminado por uma operação SET agregação ou outra.
Quando é executado o processo de impressão em série, da linha recentemente introduzida no subscritor é enviada como uma inserção para o fabricante. Inserir na tabela publicada faz com que o accionador INSERT irá ser desencadeado. Uma das instruções no activador efectua um min(column) numa coluna que permite valores nulos. Porque ANSI_WARNINGS estão definidas ON, a operação de min numa coluna que contém valores nulos desencadeia um aviso e fazer com que o estado do agente falhou.

Para contornar este cenário específico, definido ANSI_WARNINGS como FALSO como no exemplo que se segue para impedir que o aviso quando executa o código do accionador:
CREATE TRIGGER test_warning_insert ON dbo.test_warning 
FOR INSERT AS 
SET ANSI_WARNINGS OFF 
declare @i int set @i = (select min(int1) from test_warning)
				

Propriedades

Artigo: 304535 - Última revisão: sexta-feira, 3 de Outubro de 2003 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Standard Edition
Palavras-chave: 
kbmt kbprb KB304535 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 304535

Submeter comentários